描述CMS垃圾收集的工作过程。
CMS(Concurrent Mark Sweep)垃圾收集器的工作过程主要可以分为以下四个阶段:
- 初始标记(Initial Mark):这个阶段的目标是标记所有的 GC Roots 能直接关联到的对象。这个阶段需要停止所有的用户线程,但是一般情况下,这个阶段会很快完成。
-
并发标记(Concurrent Mark):在这个阶段,垃圾收集器会遍历对象图,并标记所有的存活对象,从初始标记的对象开始。这个阶段是与用户线程并发执行的,不需要停止用户线程。
-
重新标记(Remark):因为在并发标记阶段,用户线程还在运行,可能会修改了对象图,所以需要重新标记一次,以确保标记的准确性。这个阶段需要停止所有的用户线程。
-
并发清除(Concurrent Sweep):在这个阶段,垃圾收集器会清除所有未被标记的对象。这个阶段是与用户线程并发执行的,不需要停止用户线程。
需要注意的是,在并发标记和并发清除阶段,由于用户线程还在修改对象图,可能会产生一些新的垃圾对象,这些对象被称为“浮动垃圾”。CMS 收集器无法在当前的垃圾收集周期处理这些浮动垃圾,只能等到下一次垃圾收集周期再进行处理。