如何实现垃圾收集器?

sal*_*r p 55 garbage-collection

谁能指出我如何实现垃圾收集的良好来源?我正在制作类似lisp的解释语言.它目前使用引用计数,但当然在释放循环依赖对象时失败.

我一直在阅读标记和扫描,三色标记,移动和不移动,增量和停止世界,但是......我不知道什么是最好的方法来保持对象整齐地分成几组同时保持对象内存开销至少,或者如何以递增方式执行操作.

我已经阅读了一些语言,参考计数使用循环参考检测,我可以使用.我知道我可以使用像Boehm这样的免费收藏家,但我想学习如何自己动手.

我会很感激任何在线资料,对于像我这样没有经验的人有某种教程或帮助.

Jon*_*rop 31

谁能指出我如何实现垃圾收集的良好来源?

那里有很多关于垃圾收集的高级材料.该垃圾收集手册是伟大的.但我发现有一些宝贵的基本介绍信息,所以我写了一些关于它的文章.标记清除垃圾收集器的原型描述了用F#编写的最小标记扫描GC.在非常并发垃圾收集器介绍一种更先进的并发收集器.HLVM是我编写的虚拟机,包括一个处理线程的stop-the-world收集器.

实现垃圾收集器的最简单方法是:

  1. 确保你可以整理全球根源.这些是包含对堆的引用的局部变量和全局变量.对于局部变量,在其范围的持续时间内将它们推送到影子堆栈.

  2. 确保您可以遍历堆,例如,堆中的每个值都是一个实现Visit返回该对象的所有引用的方法的对象.

  3. 保留所有已分配值的集合.

  4. 通过调用malloc指针并将其插入所有已分配值的集合来进行分配.

  5. 当所有分配值的总大小超过配额时,启动标记然后扫描阶段.这递归地遍历堆积所有可到达值的集合.

  6. 分配值减去可到达值的设置差异是不可达值的集合.迭代它们调用free并从分配值集中删除它们.

  7. 将配额设置为所有已分配值总大小的两倍.

  • 嗨乔恩,我想通读你的原型设计一个标记清除垃圾收集器文章,但它要求订阅。这是阅读它的唯一方法吗 (2认同)

Mik*_*ike 8

请查看以下页面.它有很多链接. http://lua-users.org/wiki/GarbageCollection


sal*_*r p 7

正如delnan所建议的那样,我从一个非常天真的世界三色标记和扫描算法开始.我设法通过使对象列表节点将对象保留在集合中,但它确实为每个对象添加了大量数据(虚拟指针,两个指向节点的指针,一个用于保存颜色的枚举).它工作得很好,没有内存丢失在valgrind上:)从这里我可能会尝试添加一个免费列表进行回收,或某种检测何时方便停止世界,或增量方法或特殊分配器避免碎片或其他东西.如果你能指出我在哪里可以找到关于如何做这些事情或做什么的信息或建议(我不知道你是否可以评论一个已回答的问题),我会非常感激.在此期间我会检查Lua的GC.