[英]Understanding GC G1 - Concurrent Marking phase
我试图了解一些关于 GC G1 的事情,希望你们能帮助我。
据我了解,它的作用是标记从根区域可到达的所有活动对象(在并发标记阶段是在“初始标记”部分选择的幸存者区域)并估计旧区域的活动度(根据它们将被选择收集设置为混合疏散暂停)。 我对吗?
如果我理解正确,混合疏散暂停标记并删除 GC 根和记忆集无法访问的对象。 并发标记标记的是不同的对象集,因此这些对象可能会重叠,但它们不必重叠。 我对吗?
GC 根到底是什么? 它们对于新集合和混合集合是否相同(混合集合中记忆集合的引用除外)?
我下面的总结正确吗?
完全年轻的集合标记来自伊甸园和幸存者区域的所有活动对象(这意味着 GC 根可到达),并将它们撤出(复制)到新的幸存者(或旧)区域。 其余的对象被视为垃圾并被删除。 自由区域被回收。
开始时的并发标记阶段标记所有可能引用旧区域的幸存者区域(基于记住的集合?)。 存活区域在这里被视为 GC 根,因为这部分发生在完全年轻的收集期间,因此我们确信其中的所有对象都存在。 然后 GC 遍历对象图(从选定的幸存者区域的对象开始)并标记所有活动对象。
在混合疏散暂停中,根据活跃度统计(在前一阶段计算),选择一些旧区域进行收集。 然后来自选定区域的所有活动对象都被疏散(复制)到新区域(活动意味着:a. 在并发标记期间选择和 b. 在标准疏散暂停中 - 可以从 GC 根和记住的集合访问)。 其余对象作为垃圾被删除,区域被回收。
- GC G1 中整个 Concurrent Marking 阶段的作用到底是什么? 我的意思是所有部分(初始标记、根区域扫描、...、清理)。
标记阶段的作用是从根开始,向下遍历到根的所有连接组件,并将它们标记为活动状态。
“并发”只是意味着这是在多个根上同时进行的。
- 在混合疏散暂停期间,哪些对象在旧区域被标记为垃圾?
没有任何。
目标是仅标记活动对象。 任何未标记为 live 的东西,都会自动(正确地)假定为死亡。
- GC 根到底是什么? 它们对于新集合和混合集合是否相同(混合集合中记忆集合的引用除外)?
这篇文章链接在另一个 SO 问题中,列出了以下四种类型的 GC 根:
root 的定义与集合集无关。 根是任何 GC 生成或集合中的根。
- 我下面的总结正确吗?
所有四个问题中最棘手的问题。 请允许我跳过这一点。 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.