什么是简单的垃圾收集算法,用于试验简单的解释器?

时间:2012-05-18 01:29:22

标签: algorithm garbage-collection interpreter

我一直在尝试编程语言设计,并且已经到了需要实现垃圾收集系统的程度。现在我想到的第一件事是引用计数,但这不会处理引用循环。我在搜索算法时遇到的大多数页面都是关于调整现有语言(例如Java)中的垃圾收集器的参考。当我找到任何描述特定算法的内容时,我没有得到足够的实现细节。例如,大多数描述都包括“当你的程序内存运行不足时...”,这在4 GB系统上很快就不会发生,并且有很多交换。所以我正在寻找的是一些具有良好实现细节的教程,例如如何调整何时启动垃圾收集器(即,在X次内存分配之后收集,或者每隔Y分钟等等)。

为了更详细地说明我正在尝试做什么,我开始编写类似于Postscript的基于堆栈的解释器,我的下一次尝试可能是基于其中一个的S表达式语言Lisp方言。我正在直接实施C.我的目标是自我教育,并将各个阶段记录为“如何设计和编写解释器”教程。

至于到目前为止我做了什么,我编写了一个简单的解释器,它实现了一种C风格的命令式语言,它由堆栈机器式VM解析和处理(参见lang2e.sourceforge.net)。但是这种语言在输入任何函数时都没有分配新内存,并且没有任何指针数据类型,因此当时并不需要任何类型的高级内存管理。对于我的下一个项目,我想从非指针类型对象(整数,字符串等)的引用计数开始,然后在单独的内存池中跟踪任何指针类型对象(可以生成循环引用) 。然后,每当池比上一个垃圾收集周期结束时增加超过X个分配单元时,再次启动收集器。

我的要求是它不是太低效,而且易于实施和清楚地记录(记住,我希望将其发展成纸或书以供其他人遵循)。我目前在前面获得的算法是三色标记,但看起来像分代收集器会好一些,但更难记录和理解。所以我正在寻找一些明确的参考资料(最好是在线提供),其中包含足够的实施细节以帮助我入门。

2 个答案:

答案 0 :(得分:5)

有一本关于垃圾收集的好书。它被称为垃圾收集:自动动态内存管理算法,它非常出色。我已经阅读过了,所以我不推荐这个,因为你可以通过Google找到它。看看它here

对于简单的原型设计,请使用标记和扫描或任何简单的非代数,非增量压缩收集器。只有当您需要从系统提供“实时”响应时,增量收集器才是好的。只要您的系统在任何特定时间点被允许任意滞后,您就不需要增量系统。分代收集器减少了平均垃圾收集开销,但需要花费一些关于对象生命周期的假设。

我实现了所有(分代/非代,增量/非增量)和调试垃圾收集器是相当困难的。因为您希望专注于语言的设计,而不是调试更复杂的垃圾收集器,所以您可以坚持使用简单的垃圾收集器。我最有可能选择标记和扫描。

使用垃圾收集时,不需要引用计数。扔掉它。

答案 1 :(得分:1)

什么时候启动分配器可能是大开的 - 你可以在内存分配失败时使用GC,或者每次删除引用时都可以使用GC,或者在中间的任何地方使用GC。

等到你没有选择可能意味着你从不GC,如果正在运行的代码包含得很好。或者,它可能会在您的环境中引入巨大的停顿,并完全消除您的响应时间或动画或声音播放。

在每个free()上运行完整的GC可以在更多操作中分摊成本,但整个系统可能因此运行速度较慢。你可能更容易预测,但总体上更慢。

如果你想通过人为限制内存来测试这个东西,你可以简单地运行非常严格的资源限制。运行ulimit -v 1024,该shell生成的每个进程只能使用一兆字节的内存。