【问题标题】:Ruby / Rails garbage collectionRuby/Rails 垃圾回收
【发布时间】:2009-07-13 20:04:55
【问题描述】:

由于 http 是无状态的,对应用程序的每个请求都会创建一个新对象。 Rails 如何清理未使用的对象/多久清理一次?

【问题讨论】:

    标签: ruby-on-rails ruby garbage-collection


    【解决方案1】:

    简单的答案:Ruby 运行时有一个垃圾收集器。根据运行时(JRuby/JVM 分代 GC、IronRuby/CLR 分代 GC、经典 Ruby/mark-sweep GC)使用不同的算法。但基础非常简单:

    • 根据分配请求,如果“可用内存不足” - 多少不足是 GC 算法的组成部分之一 - 然后将开始 GC
    • GC 首先扫描 roots,它们是全局变量和堆栈位置(参数和局部变量),以发现哪些对象仍然存在;它标记它找到的每个对象
    • 然后,GC 进程查看这些对象内部的链接(引用),并递归到那些尚未标记的对象中
    • 然后 GC 可以开始移动/复制所有标记的对象,以便将它们压缩到内存中
    • “空闲指针”,从哪里发生新的分配,被重置到这个压缩的内存块的末尾
    • 如果仍有“可用内存不足”,则从操作系统分配更多内存
    • 在扫描过程中未标记的所有旧对象都是垃圾,并通过复制过程和空闲指针的重置被隐式丢弃。

    收集的频率取决于 GC 的调优,可能受操作系统、物理内存量、操作系统内存压力、用户控制的调整、底层平台版本修订、动态优化参数等影响. 其中大部分归结为确定“可用内存不足”测试的标准在哪里,尽管对于世代收集器来说事情变得更加复杂。

    【讨论】:

      【解决方案2】:

      如果您对此感兴趣,请查看 Phusion 团队关于写时复制垃圾收集的博客系列,以及他们为改进 Ruby 企业版中默认的 ruby​​ gc 方案所做的努力。

      http://izumi.plan99.net/blog/index.php/2007/04/05/saving-memory-in-ruby-on-rails/

      该系列的其他链接在这里:

      http://www.rubyenterpriseedition.com/faq.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-21
        • 2012-01-28
        • 2013-06-27
        • 2011-11-29
        • 2021-12-20
        • 2011-07-15
        相关资源
        最近更新 更多