概述
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需要用到更多的计算机算力。