在其他语言中,您通常有许多可能用于内存回收:
Ruby如何运作?
答案 0 :(得分:3)
垃圾收集器Ruby 1.8实际上非常糟糕。每7Mb的分配,它将从所有根对象执行标记阶段,并尝试找到可以到达的对象。那些无法到达的人将被释放。
但是,要找出哪些对象可以访问,它会检查堆栈,寄存器和分配的对象内存。这允许一些误报但是易于编写C扩展:C扩展不必引用和引用,因为自动扫描使用C扩展的堆栈等。
此外,对象的状态(引用与否)保持在每个对象的状态。这对于缓存行为和写时复制行为来说非常糟糕:在此过程中会触及大量缓存行,并且如果您有多个缓存行,则ruby解释器不会共享尽可能多的内存(与服务器相关)像Ruby on Rails这样的部署。因此,存在其他实现(Ruby Enterprise Edition),它在内存的单独部分执行此操作以加速GC。
另一个问题是长链表。由于标记和扫描使用堆栈进行递归,因此长链接列表会出现段错误。
GC也没有压缩,从长远来看这会成为问题。
但是,如果你运行JRuby,那么这些问题就会消失,同时保持Ruby 1.8的兼容性。
答案 1 :(得分:1)
Ruby的GC uses the mark-and-sweep strategy。
答案 2 :(得分:1)
“保守的标记和扫描”
请参阅this thread,其中包括Matz的描述,该描述应该是明确的。