GC 如何知道旧堆中的对象是否引用了年轻堆中的对象?

Eug*_*e_Z 5 java garbage-collection heap-memory

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

Tur*_*rac 5

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

卡表(字节阵列)是一种特定类型的记录置位的。如果引用改变,卡(每个字节在卡表中被称为卡)变脏。脏卡包含从老年代到年轻代的新指针。最后java不扫描所有旧对象,而是扫描记住的集合

GC1 卡片表和记忆集

标记卡


Kar*_*cki 2

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

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

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