如何在标记和扫描垃圾收集器中存储引用?

时间:2012-04-02 22:41:01

标签: garbage-collection mark-and-sweep

我在最近的一个周末开始编写自己的脚本语言,用于学习经历和高中毕业时的简历。到目前为止,事情已经变得很好,我可以用基本类型(null,boolean,number和string)和带有运算符优先级的数学表达式解析变量,并且有一个基本的标记和清除垃圾收集器(在完成标记/扫描收集器之后)我将实现一代分类垃圾收集器,我知道天真的标记/扫描不是很快)。不过,我不确定如何存储垃圾收集器的引用对象。截至目前,我有一个类GCObject,它存储指向它的内存的指针以及它是否被标记。我应该将链表存储到类中引用的对象吗?我看过其他语言的垃圾收集器,但我看不到每个GCObject的链接引用列表,所以让我感到困惑。

TLDR:如何在标记和清除垃圾收集器中存储其他对象引用的对象?我是否只在所有GCObjects中存储对象的链接列表?

谢谢你们。

1 个答案:

答案 0 :(得分:3)

除了这些引用自然发生的位置之外,您通常不会将对对象的引用存储在任何内容中。在标记操作期间,您不需要知道哪些引用指向对象;相反,您需要知道对象(或根)包含哪些引用,因此您可以递归地标记这些对象。

对于扫描阶段,您还需要一种迭代所有对象的方法,以便您可以最终确定任何未引用的对象并将其存储返回到分配池。你如何做到这一点完全取决于你的通用分配器 - 你可能想写一个自定义分配器。

(我假设你不想做压缩 - 这更复杂了。)