GC如何知道老年代中的对象是否引用了新生代中的对象?

6

Minor GC - 当垃圾收集器清理从“根”不可访问的年轻代中的对象时,它被称作Minor GC。Minor GC仅在年轻代上工作。但是如果一个年轻代对象被老年代引用怎么办?


https://dev59.com/PKfja4cB1Zd3GeqPqBJP#47505987 • https://dev59.com/LlDTa4cB1Zd3GeqPM-Nl#3849058 - Holger
2个回答

5
垃圾回收器需要知道引用年轻对象的旧对象。为了找到所有这些引用,可以扫描所有旧对象,但这是非常糟糕的解决方案。因此,使用“记忆集”来保存这些信息。每个线程都会通知GC是否更改了引用,这可能会导致记忆集发生变化。
“卡表”(一组字节的数组)是一种特殊类型的记忆集。如果引用发生更改,则卡片(在卡表中,每个字节称为卡片)会变脏。脏卡包含从旧代到年轻代的新指针。最后,Java不会扫描所有旧对象,而是扫描“记忆集”。
参考链接:GC1 Card Table和Remembered SetMarking card

这份说明仅适用于G1垃圾回收器,那CMS呢? - Jerry Chin
CMS已经在JEP-363中被删除。我认为当你考虑到Java的LTS版本是17时,CMS对于这个问题并不重要。 - Turac

2

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

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

在Minor GC事件期间,Tenured代被有效地忽略。从Tenured代到young代的引用被视为事实上的GC根。在标记阶段期间,从young代到Tenured代的引用将被简单地忽略。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接