-XX:+UseConcMarkSweepGC 对年轻代使用并行STW的标记复制算法,对老年代使用并发标记清除算法
设计目标
避免在老年代垃圾收集时出现长时间GC停顿时间
解决手段
- 不对老年代进行整理,使用空闲列表来管理内存
- 标记清除阶段与应用线程一起并发执行
CMS执行6阶段
初始标记
STW暂停,标记所有根对象、根对象直接引用的对象和被年轻代中所有对象引用的
注意,这里只针对老年代处理
并发标记
遍历老年代,标记所有存活对象,与应用同时运行,不用暂停
并发预清理
这一阶段并发执行,对引用发生变化的卡片区域标记为脏区
最终标记
第二次STW停顿,确认脏区的修改是否可以回收,尽量在年轻代空的情况执行
并发清除
并发执行,回收没被标记的对象(如果没有被引用,后面也不会再被引用了)
并发重置
并发执行,重置CMS算法内部数据,为下一次GC做准备
缺点
- 老年代内存碎片问题
- 造成GC不可预测而的暂停时间
