ruby - ruby 中的垃圾收集循环列表

标签 ruby garbage-collection

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

任何对 ruby​​ 1.9.2 内部结构有所了解的人都可以插话,看看 ruby​​ 是否知道如何处理更棘手的反向引用和循环引用? (理想情况下,有一些细节/关于如何实际实现的良好指示。)

最佳答案

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

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

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

关于ruby - ruby 中的垃圾收集循环列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6469771/

相关文章:

ruby 正则表达式 : complex pattern

ruby-on-rails - Google Apps 和 Rails 中的 Open ID 身份验证 - 安全性

JavaScript 内存释放

c# - 此代码会导致托管堆损坏吗?

java - 如何调整 JVM 8 G1 参数以避免 Full GC(分配失败)

ruby-on-rails - 如何在没有 STI 的情况下从两个单独的表创建 ActiveRecord 集合?

ruby - RSpec - 使用测试替身作为 block 参数

java - Java/Scala 对垃圾回收做了哪些保证?

java - Java GC 如何清理直接字节缓冲区,因为 IBM 文档说,确实如此。

ruby - Apache Camel 和 ruby