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

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

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

多谢你们。


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

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

(我假设你不想压缩 - 这是一个更复杂的事情)。

链接地址: http://www.djcxy.com/p/79097.html

上一篇: How to store references in a mark and sweep garbage collector?

下一篇: Compacting garbage collector implementation in C++0x