gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 08:35:03 24 4
gpt4 key购买 nike

在其他语言中,通常有多种内存回收的可能性:

  • 标记对象然后移除它们
  • 显式保留和释放
  • 计算对对象的引用
  • 内部堆配置

Ruby 是如何工作的?

最佳答案

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

然而,为了找出哪些对象是可达的,它会检查堆栈、寄存器和分配的对象内存。这允许一些误报,但简化了 C 扩展的编写:C 扩展不必引用和遵循,因为堆栈等使用 C 扩展的是自动扫描的。

此外,对象的状态(被引用或未被引用)保存在每个对象的状态中。这对缓存行为和写时复制行为非常不利:在此过程中会触及很多缓存行,并且如果你有多个缓存行,ruby 解释器不会共享尽可能多的内存(与服务器相关)像 Ruby on Rails 一样部署)。因此,存在其他实现(Ruby 企业版),它们在内存的单独部分执行此操作以加快 GC 速度。

还有一个问题是长链表。由于标记和清除使用堆栈进行递归,因此长链表会导致 ruby​​ 段错误。

GC 也不进行压缩,从长远来看这会成为问题。

但是,如果您运行 JRuby,这些问题就会消失,同时在一定程度上保持 Ruby 1.8 的兼容性。

关于ruby - MRI Ruby 1.8 使用什么样的内存回收算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/997614/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com