【问题标题】:Garbage collecting a circular list in ruby垃圾在红宝石中收集循环列表
【发布时间】:2011-06-24 15:09:33
【问题描述】:

我正在学习 ruby​​ 的标记和清除垃圾收集方法。我在这里和那里遇到了一些线程(以及this article 通过我无法再发现的 SO 线程),但它们似乎适用于旧版本的 ruby​​,并且它们中的信息并不总是一致的。 (就目前的情况而言,我的印象是它主要是引用计数。)

可能有人对 ruby​​ 1.9.2 的内部有一些不了解,关于 ruby​​ 是否知道如何处理更棘手的反向引用和循环引用? (理想情况下,有一些关于它如何实际实现的细节/好的指针。)

【问题讨论】:

  • 您是出于好奇,还是想优化您的应用程序?
  • 主要是出于好奇。我曾经在 php 中遇到过循环引用的问题,并且在 ruby​​ 中没有看到任何 destruct 方法,想知道它处理的效果如何,比如说,在一个定向(并且可能是循环)图中的节点表示。

标签: ruby garbage-collection


【解决方案1】:

Mark-and-sweep GC,就像几乎所有通常标记为垃圾收集保存引用计数的算法一样,可以很好地处理循环引用。这与具体实现无关。不管 Ruby 1.9 使用什么实际的 GC,它都不会遇到循环问题。这是标记和清除收集器方法的草图,但请放心,其他收集方案也可以处理循环引用。

  1. 将所有已知的事物标记为始终可访问(“根”,基本上是直接在范围内的所有事物 - 全局变量、局部变量等)
  2. 标记标记对象引用的所有尚未标记的对象
  3. 重复 2 直到没有从已标记对象到未标记对象的引用为止
  4. 枚举所有已分配的对象,释放那些未标记的对象

您会看到,“从外部”可访问的引用圈不会导致无限递归(我们不会多次访问给定对象的引用),而无法访问的引用圈则不会t 标记为可达,因此在标记后被释放(每个元素独立)。

【讨论】:

  • 好的。因此,如果我做对了并改写了这一点,它会检​​查是否有从 irb 对象(或程序的主循环/内核/无论它被称为什么)到对象的任何路径,如果没有,它会被标记为不可访问?
  • @Denis:从概念上讲,这会导致相同的结果,但实施起来会非常困难。所以我们改为假设一切都是不可达的,直到我们找到一条可达的“路径”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-12
  • 2016-05-31
相关资源
最近更新 更多