追踪世代GC如何确定年轻一代的垃圾?

时间:2012-12-01 11:58:10

标签: language-agnostic garbage-collection

让我们假设我们有一个只有两代的简单代际GC,“旧”代(至少存在一个集合的对象)和“年轻”代(新分配)。那么GC究竟如何确定一个“年轻”的对象是垃圾而没有从根本上追踪整个参考图?或者换一种说法:当仅用于收集“年轻”一代时,GC选择什么作为跟踪的根?

我对一般方法感兴趣,但也从现有实现的具体示例中感兴趣。

谢谢!

1 个答案:

答案 0 :(得分:2)

有一些技术可以归结为维护哪些旧的gen对象(或旧代内存的范围)可能包含对年轻对象的引用。

我能想到的几乎所有实现都通过添加写入障碍来维护这些知识。当年轻的gen引用存储在old-gen对象中时,这些写入障碍会触发,从而导致执行一个记住新引用的小代码片段。

为了存储这些知识,一些GC使用card marking,其中使用紧凑位图将小型内存块标记为“包含对年轻代的引用”。其他人保持明确的“记忆集”,这对于单个对象做了类似的事情。在这两种情况下,年轻的收藏品然后将(由卡表标记的记忆集/记忆块)中的对象添加到根。

至于具体实施: