91-java cms垃圾回收器
Java中的CMS(Concurrent Mark Sweep)垃圾收集器是一种老年代垃圾收集器,适用于处理老年代的垃圾收集。它使用标记-清除算法,但通过并发的方式来减少垃圾收集对应用的影响。
CMS垃圾收集器有以下几个阶段:
-
初始化标记(Initial Mark):这个阶段会停止所有的应用线程,并记录下直接与根节点相连的对象。
-
并发标记(Concurrent Mark):在初始化标记的基础上继续进行垃圾收集,同时应用线程继续运行。
-
并发预清理(Concurrent Preclean):为了减少标记阶段的开销,预先清理一些已经死亡的对象。
-
重新标记(Remark):停止所有应用线程,重新标记在并发标记阶段发生变动的对象。
-
并发清除(Concurrent Sweep):垃圾收集器线程开始清除未被标记的对象,而应用线程继续运行。
-
并发重置(Concurrent Reset):这个阶段为下一次GC做准备,重置记录的垃圾收集信息。
CMS垃圾收集器的优点是低延迟,但是其缺点也很明显,包括:
-
对CPU资源非常敏感。
-
无法处理浮动垃圾,可能导致"Concurrent Mode Failure",这时候会退化成旧的标记-清除算法进行垃圾收集,停止所有应用线程。
-
因为并发执行,所以无法保证垃圾收集过程中的内存空间的一致性,可能产生不一致的垃圾收集器根。