1

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

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

多谢你们。

4

1 回答 1

3

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

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

(我假设您不想进行压缩 - 这要复杂得多)。

于 2012-04-02T23:00:24.840 回答