前言
前文描述过,当GC时需要枚举的GC根节点需要极短的停顿(STW)
而在遍历GC引用链时,如果用户线程是停顿的,那么不会改变引用,GC线程遍历标识即可
但随着堆内存中对象的增多,引用链会越来越长,如果持续让用户线程停顿,在某些需要低延迟的场景是不理想的
因此希望能在这个环节让用户线程和GC线程能够并发执行,并发执行就会存在改变对象引用,可能导致对象消失问题,其中可以使用增量更新和原始快照的方式解决,而CMS使用的就是增量更新
Concurrent Mark Sweep
CMS全称Concurrent Mark Sweep 并发标记清除收集器
CMS是老年代收集器,采用标记-清除算法,年轻代常用ParNew收集器,以最短停顿时间(低延迟)为目标的收集器
CMS并没有使用标记-整理算法,因为标记、清理阶段是和用户线程并发执行的,如果使用标记-整理算法可能会导致移动引用的位置导致出错
执行步骤
-
初始标记: 标记GC Roots直接关联的对象(STW时间极短)
-
并发标记: 从GC Roots直接关联对象开始遍历整个引用链的过程(耗时长,不需要停顿用户线程,用户线程与GC线程并发执行)