gpt4 book ai didi

java - 垃圾收集: Initial marking and concurrent marking

转载 作者:行者123 更新时间:2023-12-01 12:58:23 27 4
gpt4 key购买 nike

对于Java中的Concurrent-Mark-Sweep垃圾收集器;我不清楚这两个阶段有什么不同。为什么需要并发标记?初始标记没有找到所有 Activity 对象吗?

最佳答案

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

  • 白色 - 无标记
  • 灰色 - 对象已标记,但其出站引用未处理
  • 黑色 - 对象已标记,所有出站引用均已处理

标记从从可到达的对象变灰开始,当没有更多的灰色对象可用时,标记被认为完成。

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

他们是

  • 可用的局部变量是线程堆栈
  • 从年轻空间到旧空间的引用

由于只有旧空间适合并发标记,因此所有堆栈和新空间都应以 stop-the-world 方式进行处理。这构成了 CMS 的初始标记阶段。

一旦initial-mark完成,CMS在旧空间中有一定数量的灰色对象来开始并发标记。在并发标记期间,如果应用程序线程修改了黑色对象,则它们可能会恢复为灰色。卡标记写入器屏障允许 CMS 跟踪修改。

最后,CMS 又做了一次暂停评论。 Remark 再次重新扫描堆栈和年轻空间,并完成旧空间的标记(大多数可到达的对象已经是黑色的,因此标记相当快)。年轻空间和堆栈不受写屏障跟踪,因此 CMS 必须重新扫描它们以查找对旧空间的新引用。

remark完成后,旧空间中只有黑白物体,可以继续清扫。

您可以在 this article 中阅读有关 CMS 收集器的更多详细信息.

关于java - 垃圾收集: Initial marking and concurrent marking,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23713129/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com