【问题标题】:How to store references in a mark and sweep garbage collector?如何在标记和清除垃圾收集器中存储引用?
【发布时间】:2012-04-16 14:37:11
【问题描述】:

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

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

谢谢大家。

【问题讨论】:

    标签: garbage-collection mark-and-sweep


    【解决方案1】:

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

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

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

    【讨论】:

    • 是的,我已经有了遍历对象的方法,我想知道是否应该将根存储的引用存储在链表中,或者是否有其他方法可以做到这一点。链接列表似乎有点矫枉过正。
    • 你好像误会了。您不需要将“引用根存储”存储在列表或其他任何内容中;这些引用已经存储在根目录中。
    • 它们是如何存储在根中的,不过,这就是我要问的。但我已经在别处找到了答案。无论如何,谢谢。
    • 对于非重定位“标记和扫描”收集器,必须遍历死对象。然而,一些 GC 框架采用更简单的方法:将所有活动对象复制到一个新堆并丢弃旧堆。这种方法避免了 GC 的任何死对象成本。
    猜你喜欢
    • 1970-01-01
    • 2015-07-13
    • 2014-11-08
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    相关资源
    最近更新 更多