如何实现垃圾收集器?
任何人都可以指出我有关如何实施垃圾收集的好资源? 我正在制作一种类似lisp的解释性语言。 它目前使用引用计数,但当然在释放循环依赖对象时失败。
我一直在阅读标记和扫描,三色标记,移动和非移动,渐进和停止世界,但是......我不知道什么是最好的方式来保持物体整齐地分成几组,尽可能减少对象内存开销,或者如何增量执行操作。
我已经阅读了一些使用循环参考检测的引用计数语言,我可以使用它。 我知道我可以免费使用像Boehm这样的收藏家,但我想学习如何自己做。
我将不胜感激任何在线教材,或者为那些没有像我这样的主题经验的人提供帮助。
任何人都可以指出我有关如何实施垃圾收集的好资源?
有很多关于垃圾收集的高级资料。 垃圾收集手册很棒。 但是我发现有一些宝贵的基本介绍信息,所以我写了一些关于它的文章。 原型化标记扫描垃圾收集器描述了用F#编写的最小标记扫描GC。 非常并发的垃圾收集器描述了一个更高级的并发收集器。 HLVM是我写的一个虚拟机,它包含一个处理线程的世界终结器。
实现垃圾收集器的最简单方法是:
确保你能整理全球的根源。 这些是包含对堆的引用的本地和全局变量。 对于局部变量,在其作用域的持续时间内将它们推入到影子堆栈中。
确保你可以遍历堆,例如堆中的每个值都是实现了一个Visit
方法的对象,该方法返回来自该对象的所有引用。
保留所有分配值的集合。
通过调用malloc
分配,并将指针插入所有已分配值的集合中。
当所有分配值的总大小超过配额时,启动标记,然后扫描相位。 这递归遍历堆积累所有可达值的集合。
所分配的值与可达值的设定差异是不可达值的集合。 遍历它们, free
调用并从分配的值集中移除它们。
将配额设置为所有分配值的总大小的两倍。
看看下面的页面。 它有很多链接。 http://lua-users.org/wiki/GarbageCollection
正如delnan所建议的,我从一个非常天真的停止世界三色标记和扫描算法开始。 我设法通过使对象成为链表节点来保留对象,但它确实为每个对象(虚拟指针,两个指向节点的指针,一个枚举来保存颜色)添加了很多数据。 它的工作原理完美,valgrind没有丢失任何内存:)从这里我可以尝试添加一个免费的回收列表,或者某种能够检测何时方便停止世界,增量方法或特殊分配器避免碎片或其他东西。 如果你能指出我在哪里寻找信息或建议(我不知道你是否可以评论一个回答的问题)如何做这些事情或做什么,我会非常感激。 我将在此期间检查Lua的GC。
链接地址: http://www.djcxy.com/p/27161.html