Java 垃圾收集:初始标记和并发标记

Java 垃圾收集:初始标记和并发标记,java,garbage-collection,Java,Garbage Collection,用于Java中的并发标记扫描垃圾收集器;我不清楚这两个阶段有什么不同。为什么需要同时标记?初始标记没有找到所有活动对象吗?使用CMS,即所谓的三色标记算法来标记活动对象 白色-无标记 灰色-对象已标记,但未处理其出站引用 黑色-标记对象并处理所有出站引用 标记从灰显可从根访问的对象开始,当不再有灰色对象可用时,标记被视为完成 CMS中的并发标记仅在旧空间中进行标记。因此,旧空间之外的所有引用都是根引用 是的 可用的局部变量是线程堆栈 从年轻空间到老年空间的参照 由于只有旧空间适合同时标记

用于Java中的并发标记扫描垃圾收集器;我不清楚这两个阶段有什么不同。为什么需要同时标记?初始标记没有找到所有活动对象吗?

使用CMS,即所谓的三色标记算法来标记活动对象

  • 白色-无标记
  • 灰色-对象已标记,但未处理其出站引用
  • 黑色-标记对象并处理所有出站引用
标记从灰显可从根访问的对象开始,当不再有灰色对象可用时,标记被视为完成

CMS中的并发标记仅在旧空间中进行标记。因此,旧空间之外的所有引用都是根引用

是的

  • 可用的局部变量是线程堆栈
  • 从年轻空间到老年空间的参照
由于只有旧空间适合同时标记,因此所有堆栈和年轻空间都应以世界流行的方式进行处理。这构成了CMS的初始标记阶段

一旦
初始标记
完成,CMS将在旧空间中设置若干个灰色对象以开始并行标记。在并发标记期间,如果应用程序线程对黑色对象进行了修改,则黑色对象可能会恢复为灰色。卡片标记写入器屏障允许CMS跟踪修改

最后,CMS正在做另一个停止世界暂停
备注
。备注:再次重新扫描堆栈和年轻空间,并完成旧空间的标记(大多数可达对象已为黑色,因此标记相当快)。年轻的空间和堆栈不会被写屏障跟踪,所以CMS必须重新扫描它们以找到对旧空间的新引用

备注
完成后,旧空间中只有黑白物体,因此可以继续清扫


您可以在中阅读有关CMS collector的更多详细信息。

这是一种尽量减少GC停止应用程序所需时间的方法。因此,是否只有一些对象在初始标记阶段被吓坏并随后标记,而其余对象在并发阶段被扫描和标记?您的想法太简单了。GC不只是为了好玩而做同样的事情3次。你所说的“初始标记”是什么意思?@meriton,这是CMS垃圾收集库的第一阶段,需要详细的回复。你的文章说“卡片表(参见卡片标记写屏障)用于识别旧空间中内存的修改部分,但是线程堆栈和新空间应该再次扫描。”我认为线程堆栈上的项目是根。因此,在重新标记期间,我们再次查看在并发标记期间修改的对象,看看它们是否仍然有效,然后再次扫描线程堆栈,形成一个新的树。这是正确的理解吗?我们不在乎物体是否“还活着”。目标是找到无法到达的对象。如果某些对象在并发阶段变得不可访问,那么在下一个CMS周期之前,它们将保持不可检测状态。这种效应被称为“浮动垃圾”