垃圾收集红宝石的圆形清单

时间:2011-06-24 15:09:33

标签: ruby garbage-collection

我正在学习ruby的标记和扫描垃圾收集方法。我在这里和那里碰到了几个线程(并且this article通过一个我不能再发现的SO线程),但它们似乎适用于旧版本的ruby并且它们中的信息并不总是一致的。 (事实上​​,我的印象是它主要是引用计数。)

对于任何对ruby 1.9.2内部人员有所了解的人来说,是否会知道如何处理棘手的背引用和循环引用? (理想情况下,有一些关于如何实际实施的细节/指示。)

1 个答案:

答案 0 :(得分:4)

标记和扫描GC,就像通常标记为垃圾收集保存引用计数的几乎所有算法一样,处理循环引用就好了。这与具体实现无关。无论Ruby 1.9使用的实际GC如何,它都不会遇到循环问题。这是标记和扫描收集器方法的草图,但请确保其他收集方案也处理循环引用。

  1. 标记所有已知的东西总是可以到达的(“根”,基本上是直接在范围内的所有东西 - 全局变量,局部变量等)。
  2. 标记由标记对象引用的所有尚未标记的对象
  3. 重复2,直到没有标记为尚未标记的对象的引用
  4. 枚举所有已分配的对象,取消分配未标记的对象
  5. 你看,一个“从外部”可以访问的引用圈不会导致无限递归(我们不会多次访问给定对象的引用)和一个无法访问的引用圈isn' t标记为可达,因此在标记后自由释放(每个元素独立)。