MRI Ruby 1.8使用什么样的内存回收算法?

时间:2009-06-15 18:33:40

标签: ruby memory-management

在其他语言中,您通常有许多可能用于内存回收:

  • 标记对象,然后将其删除
  • 明确保留和释放
  • 计算对象的引用
  • 内部堆配置

Ruby如何运作?

3 个答案:

答案 0 :(得分:3)

垃圾收集器Ruby 1.8实际上非常糟糕。每7Mb的分配,它将从所有根对象执行标记阶段,并尝试找到可以到达的对象。那些无法到达的人将被释放。

但是,要找出哪些对象可以访问,它会检查堆栈,寄存器和分配的对象内存。这允许一些误报但是易于编写C扩展:C扩展不必引用和引用,因为自动扫描使用C扩展的堆栈等。

此外,对象的状态(引用与否)保持在每个对象的状态。这对于缓存行为和写时复制行为来说非常糟糕:在此过程中会触及大量缓存行,并且如果您有多个缓存行,则ruby解释器不会共享尽可能多的内存(与服务器相关)像Ruby on Rails这样的部署。因此,存在其他实现(Ruby Enterprise Edition),它在内存的单独部分执行此操作以加速GC。

另一个问题是长链表。由于标记和扫描使用堆栈进行递归,因此长链接列表会出现段错误。

GC也没有压缩,从长远来看这会成为问题。

但是,如果你运行JRuby,那么这些问题就会消失,同时保持Ruby 1.8的兼容性。

答案 1 :(得分:1)

答案 2 :(得分:1)

“保守的标记和扫描”

请参阅this thread,其中包括Matz的描述,该描述应该是明确的。