我正在学习 ruby 的标记和清除垃圾收集方法。我在这里和那里遇到了一些线程(以及 this article 通过我无法再发现的 SO 线程),但它们似乎适用于旧版本的 ruby 并且其中的信息并不总是一致的。 (就目前情况而言,我的印象是它主要是引用计数。)
任何对 ruby 1.9.2 内部结构有所了解的人都可以插话,看看 ruby 是否知道如何处理更棘手的反向引用和循环引用? (理想情况下,有一些细节/关于如何实际实现的良好指示。)
最佳答案
标记和清除 GC,就像几乎所有通常标记为垃圾收集保存引用计数的算法一样,可以很好地处理循环引用。这与具体实现无关。无论 Ruby 1.9 实际使用什么 GC,它都不会有循环问题。这是标记和清除收集器方法的草图,但请放心,其他收集方案也可以处理循环引用。
- 标记所有已知始终可访问的内容(“根”,基本上是直接位于范围内的所有内容 - 全局变量、局部变量等)
- 标记已标记对象引用的所有尚未标记的对象
- 重复 2,直到不存在从已标记对象到尚未标记对象的引用
- 枚举所有已分配的对象,释放未标记的对象
你看,“从外部”可到达的引用循环不会导致无限递归(我们不会多次访问给定对象的引用),而不可到达的引用循环则不会导致无限递归。 t 标记为可达,因此在标记后被释放(每个元素独立)。
关于ruby - ruby 中的垃圾收集循环列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6469771/