假设我们有一个简单的分代 GC,只有两代,“老”代(至少在一次收集中幸存的对象)和“年轻”代(新分配的)。那么,如果不从根部跟踪整个引用图,GC 究竟如何确定一个“年轻”对象是垃圾呢?或者换一种说法:当只收集“年轻”一代时,GC 选择什么作为跟踪的根?
我对通用方法感兴趣,但也对现有实现的特定示例感兴趣。
谢谢!
假设我们有一个简单的分代 GC,只有两代,“老”代(至少在一次收集中幸存的对象)和“年轻”代(新分配的)。那么,如果不从根部跟踪整个引用图,GC 究竟如何确定一个“年轻”对象是垃圾呢?或者换一种说法:当只收集“年轻”一代时,GC 选择什么作为跟踪的根?
我对通用方法感兴趣,但也对现有实现的特定示例感兴趣。
谢谢!
有一些技术可以归结为维护哪些老一代对象(或老一代内存范围)可能包含对年轻对象的引用的知识。
我能想到的几乎所有实现都通过添加写屏障来保持这些知识。当年轻代引用存储在老代对象中时,这些写屏障触发,从而导致执行一个记住新引用的小代码片段。
为了存储这些知识,一些 GC 使用card marking,其中使用紧凑的位图将小的内存块标记为“包含对年轻代的引用”。其他人维护明确的“记忆集”,它对单个对象做类似的事情。在这两种情况下,年轻一代的集合然后将(由卡表标记的记忆集/内存块)中的对象添加到根。
至于具体实现: