Concurrent Mark Sweep Collector是回收停顿时间比较短,它通过初始标记(Initial Mark),并发标记(Concurrent Mark),重新标记(Remark),并发清除(Concurrent Sweep)四个步骤完成垃圾回收工作,第1,3步的初始标记和重新标记依然会引发STW,而第2,4步的并发标记和并发清除两个阶段可以和应用程序并发执行,也是比较耗时的操作,但并不影响应用程序的正常执行。
由于CMS采用的是‘标记-清除算法’,因此会产生大量的空间碎片。为了解决这个问题,CMS可以通过配置 -XX:UseCMSCompactAtFullCollection 参数,强制JVM在FGC完成后对老年代进行压缩,执行一次空间碎片整理,但是空间碎片整理也会引发STW,为了减少STW的次数,CMS还可以通过配置 -XX:CMSFullGCsBeforeCompaction=n参数,在执行了n次FGC后,JVM再在老年代执行空间碎片整理。