Java CMS收集器

概述

CMS收集器是并发GC的首次尝试,新生代采用复制算法,老年代默认采用标记清除算法,标记采用了三色标记算法。

启用参数:-XX:+UseConMarkSweepGC

CMS执行流程

CMS收集器执行流程图

1.初始标记,STW单线程执行,从GC Root出发标记首层引用。

2.并发标记,并发执行,从首层标记出发向下标记引用对象。

3.重新标记,STW执行,重新对对象进行一次标记,避免未标记到的情况。

4.并发清除,并发执行,将未标记到的对象清除。

5.重置线程,并发执行,将所有打上标记的对象重置到未标记状态。

CMS优势与劣势

优势

1.并发执行,极大地较少了STW的时间,也就变相的提高了吞吐量。

劣势

1.老年代默认采用了标记清除算法,会产生大量的内存碎片,有两个参数可对这个问题进行优化(-XX:+UseCMSCompactAtFullCollection指定GC后,进行一次碎片整理;-XX:CMSFullGCsBeforeCompaction指定多少次GC后进行一次碎片整理)。

2.由于采用并发执行,在并发Full GC过程中如果有新对象进入老年代对象过大,为避免OOM,会导致CMS调用Serial old收集器进行单线程Full GC,执行效率会严重下降,为避免这个问题可以通过设置-XX:CMSInitiatingOccupancyFraction(默认92)设置当老年代达到多少占比的时候就进行Full GC。

3.三色标记算法会有漏标多标问题,CMS为解决漏标,也进行了相对其他STW收集器更多的遍历次数(这里不做延伸,想知道三色标记算法的可自行搜索)。

4.从上可知,CMS需要用到更多的计算机算力。


我的其他相关链接

Java GCParallel收集器CMS收集器G1收集器GC跨代收集问题

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容