CMS就是Concurrent Mark Sweep
CMS使用标记-清除算法进行垃圾收集,分为4大步:
- 初始标记:标记所有从GC Roots直接可达的对象,这个阶段需要STW,但速度很快
- 并发标记:从初始标记的对象出发,遍历所有对象,标记所有可达的对象,这个阶段是并发进行的;
- 重新标记:完成剩余的标记工作,包括处理并发阶段遗留下来的少量变动,这个阶段通常需要短暂的STW停顿;
- 并发清除:清除未被标记的对象,回收他们占用的内存空间;
那么,再刚刚的过程中,你提到了重新标记,重新标记是怎么执行的?
- 重新标记remark阶段通常会结合三色标记法来执行,确保在并发标记期间所有存活对象都被正确标记。目的是修正并发标记阶段中可能遗漏的对象引用变化;
- 在remark阶段,垃圾收集器会停止应用线程STW,以确保在这个阶段不会有引用关系的进一步变化。这种暂停通常很短暂。remark阶段主要包括了以下操作:
- 处理写屏障记录的引用变化:在并发标记阶段,应用程序可能会更新对象的引用(比如以一个黑色对象新增了对一个白色对象的引用),这些变化通过写屏障记录下来。在remark阶段,GC会处理这些记录,确保所有可达对象都正确地标记为灰色或黑色。
- 扫描灰色对象:再次遍历灰色对象,处理它们的所有引用,确保引用的对象正确标记为灰色或者黑色。
- 清理:确保所有引用关系正确处理后,灰色对象标记为黑色,白色对象保持不变。这一步完成后,所有存活对象都应当是黑色的;
刚刚提到了三色标记法,那就顺带普及下