CMS:以获取最短回收停顿时间为目标的收集器,基于并发“标记清理”实现
过程:
1、初始标记:独占CPU,仅标记gcRoot能直接关联的对象
2、并发标记:可以和用户线程并行执行,标记所有可达对象
3、重新标记:独占CPU(STW),对并发标记阶段用户线程运行产生的垃圾对象进行标记修正
4、并发清理:可以和用户线程并行执行,清理垃圾
优点:
并发,低停顿
缺点:
1、对CPU非常敏感:在并发阶段虽然不会导致用户线程停顿,但是会因为占用了一部分线程使应用程序变慢
2、无法处理浮动垃圾:在最后一步并发清理过程中,用户县城执行也会产生垃圾,但是这部分垃圾是在标记之后,所以只有等到下一次gc的时候清理掉,这部分垃圾叫浮动垃圾
3、CMS使用“标记-清理”法会产生大量的空间碎片,当碎片过多,将会给大对象空间的分配带来很大的麻烦,往往会出现老年代还有很大的空间但无法找到足够大的连续空间来分配当前对象,不得不提前触发一次FullGC,为了解决这个问题CMS提供了一个开关参数,用于在CMS顶不住,要进行FullGC时开启内存碎片的合并整理过程,但是内存整理的过程是无法并发的,空间碎片没有了但是停顿时间变长了
CMS 出现FullGC的原因:
1、年轻带晋升到老年带没有足够的连续空间,很有可能是内存碎片导致的
2、在并发过程中JVM觉得在并发过程结束之前堆就会满,需要提前触发FullGC