-XX:+UseConcMarkSweepGC 对年轻代使用并行STW的标记复制算法,对老年代使用并发标记清除算法

设计目标

避免在老年代垃圾收集时出现长时间GC停顿时间

解决手段

  • 不对老年代进行整理,使用空闲列表来管理内存
  • 标记清除阶段与应用线程一起并发执行

CMS执行6阶段

初始标记

STW暂停,标记所有根对象、根对象直接引用的对象和被年轻代中所有对象引用的
注意,这里只针对老年代处理
image.png

并发标记

遍历老年代,标记所有存活对象,与应用同时运行,不用暂停
image.png

并发预清理

这一阶段并发执行,对引用发生变化的卡片区域标记为脏区
image.png

最终标记

第二次STW停顿,确认脏区的修改是否可以回收,尽量在年轻代空的情况执行
image.png

并发清除

并发执行,回收没被标记的对象(如果没有被引用,后面也不会再被引用了)
image.png

并发重置

并发执行,重置CMS算法内部数据,为下一次GC做准备

缺点

  • 老年代内存碎片问题
  • 造成GC不可预测而的暂停时间