新生代使用ParNew回收器,老年代使用CMS回收器。
标记根对象
标记所有对象
清理前的准备以及控制停顿时间
(可以采用-XX:-CMSPrecleaningEnabled关闭,不进行预清理)
为什么要有预清理?
因为第4步重新标记是独占CPU的,如果YoungGC发生后,立即触发一次重新标记,那么一次停顿时间可能很长,为了避免这种情况,预处理时,会刻意等待一次新生代GC的发生,然后根据历史数据预测下一次YoungGC的时间,在当前时间和预测时间取中间时刻执行重新标记操作,目的就是尽量避免YoungGC与重新标记重叠执行。从而减少一次停顿时间。
修正并发标记数据
清理垃圾(真正的执行垃圾回收)
重置状态等待下次CMS的触发