跟踪一代GC如何确定年轻一代中的垃圾



让我们假设我们有一个只有两代的简单世代GC,即"旧"一代(至少存活了一个集合的对象)和"年轻"一代。那么,如果不从根开始跟踪整个引用图,GC将如何准确地将"年轻"对象确定为垃圾呢?或者换一种说法:当决定只收集"年轻"一代时,GC会选择什么作为跟踪的根?

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

谢谢!

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

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

为了存储这些知识,一些GC使用卡片标记,其中使用紧凑位图将小的ish内存块标记为"包含对年轻一代的引用"。其他人则保持明确的"记忆集",这对单个对象也有类似的作用。在这两种情况下,年轻一代集合都会将(由卡片表标记的记忆集/内存块)中的对象添加到根中。

关于具体实施:

  • 单声道使用记忆集
  • PyPy有几个GC,最新和最闪亮的(Minimark)使用记忆集,并为单个大数组添加了卡片标记
  • .NET使用卡片标记

最新更新