【问题标题】:How GC knows if object in old heap references an object in young heap?GC 如何知道旧堆中的对象是否引用了年轻堆中的对象?
【发布时间】:2019-12-02 19:43:12
【问题描述】:

Minor GC - 当垃圾收集器清除年轻代中未从“根”引用的对象时。 Minor GC 仅适用于年轻堆。但是如果从旧堆中引用了一个年轻的对象呢?

【问题讨论】:

标签: java garbage-collection heap-memory


【解决方案1】:

垃圾收集器需要知道引用年轻对象的旧对象。要查找所有这些引用,它可以扫描所有旧对象,但这是非常糟糕的解决方案。所以记住设置保留这些信息。然后每个线程通知 GC 如果它更改了引用,这可能会导致记忆集发生变化。

卡片表(字节数组)是一种特殊类型的记忆集。如果引用改变,卡片(每个字节在卡片表中被称为卡片)变脏。脏卡包含从老年代到年轻代的新指针。最后java不扫描所有旧对象,而不是扫描remembered set

GC1 Card Table and Remembered Set

Marking card

【讨论】:

  • 这个解释只针对G1采集器,CMS呢?
  • CMS 已被 JEP-363 删除。当您认为 java 的 LTS 版本是 17 时,我认为 CMS 对这个问题并不重要
【解决方案2】:

Minor GC 会收集年轻代,但这并不意味着 GC 只会查看年轻代堆区域。考虑整个堆,并且从老年代到年轻代的引用会将年轻代中的对象标记为活动的。

这在Minor GC vs Major GC vs Full GC中有描述:

在 Minor GC 事件期间,Tenured 生成被有效地忽略。从老生代到年轻代的引用被认为是事实上的 GC 根源。在标记阶段,从年轻代到 Tenured 代的引用会被简单地忽略。

【讨论】:

    猜你喜欢
    • 2011-05-27
    • 2022-01-04
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多