如果我们知道在Young Generation上标记它们之后的所有死对象,我们为什么需要对Old Generation中无法到达的对象进行特定搜索?

时间:2017-11-29 01:17:07

标签: java garbage-collection jvm g1gc

我知道在CMS和G1堆中分为Eden,Survivor空间和Old Generation,唯一不同的是在CMS中这个划分是真实的(这些空间是连续的并且位于存储器的不同部分)而在G1中它是合乎逻辑的(堆被分成±2000个动态区域,每个区域从1到32 MB)。

在满足伊甸园空间的两种情况下,年轻人撤离开始,步骤如下: 初始标记。 STW。标记应用程序的根源。 并行标记。 从链接的根部转换到从这些对象到其他对象的对象,因此所实现的对象被标记为活动的。 备注。 STW。在并发标记期间创建的对象也标记为实时(浮动垃圾)。 清理 最后阶段为即将到来的疏散阶段做好准备,计算堆区域中的所有活动对象,并按预期的GC效率对这些区域进行排序。

如果堆的满足达到阈值,则混合疏散(Young + Old)从G1开始。 在Old Generation中创建死亡对象是基于“记忆集”。每个区域都有一个记忆集,列出从外部指向该区域的引用。这些参考文献被视为额外的GC根源。

G1决定将老一代和年轻一代的哪些地区添加到收藏集中。

如果我们拥有所有对象的整个图形并且在Young疏散级别上标记它们之后知道所有活动和死亡对象,为什么我们需要记住集合并在旧代中特定搜索无法到达的对象?

1 个答案:

答案 0 :(得分:0)

记忆集(或CMS中的卡表)背后的想法不是在旧生成"中搜索无法访问的对象,而是快速识别在生成对象时需要更新的旧生成中的引用在Young收藏期间被移动。

疏散对象的地址被更改=>必须更新对此对象的所有传入引用。如果没有Remembered Sets,则需要扫描整个堆以查找所有传入的引用(当然,这可能需要很长时间)。