【问题标题】:What do the fields of Ruby's GC.stat mean?Ruby 的 GC.stat 的字段是什么意思?
【发布时间】:2012-09-28 05:58:03
【问题描述】:

我正在使用GC.stat 来分析我们的 Rails 应用程序中的内存使用情况。 GC.stat 返回具有以下键的哈希:

:count
:heap_used
:heap_length
:heap_increment
:heap_live_num
:heap_free_num
:heap_final_num

有人知道这些值的确切含义吗?在 Ruby 源代码 (gc.c) 中没有它们的文档,只有一条评论:“哈希的内容是实现定义的,将来可能会更改。”

其中一些字段在上下文中是有意义的,例如count 是 Ruby 分配的堆数。但是heap_final_num 是什么? heap_increment 是什么? heap_length 是最小堆大小吗?

我在摆弄RUBY_MIN_HEAP_SLOTSRUBY_FREE_MINRUBY_GC_MALLOC_LIMIT,但更改这些环境变量似乎对:heap_count:heap_length 没有任何影响。如果我从根本上增加最小堆槽,我预计:heap_count 会下降。所以我真的很想知道所有GC.stat 值代表什么!

我使用的是 Ruby 1.9.3。

【问题讨论】:

    标签: ruby memory-management garbage-collection memory-profiling


    【解决方案1】:

    :count - gc 循环数,例如gc 运行了多少次

    :heap_used - 分配的堆数,ruby 默认创建一个堆,如果不足以分配所有对象,则增加堆数

    :heap_length - 堆的大小。这是第一个堆大小。理想情况下,脚本启动后应该有一个堆

    :heap_increment - 如果 ruby​​ 创建新堆,将添加到最后一个堆大小的数字

    :heap_live_num - 分配了多少堆槽

    :heap_free_num - 有多少堆槽是空闲的

    :heap_final_num - 终结器插槽号

    你是对的,通过增加RUBY_MIN_HEAP_SLOTS,堆的数量应该减少到一个。但是RUBY_FREE_MIN 越高,你得到的堆就越多。它指示当前堆应该具有的空闲槽的数量,如果该数量小于您提供的数量 - ruby​​ 会创建新堆。 RUBY_GC_MALLOC_LIMIT 与 ruby​​ 运行 GC 进程的频率更相关,并且不直接影响堆数。此计数器指示在多少 malloc 之后 ruby​​ 将运行 GC。但它甚至可以更早地运行。请注意,这不是 ruby​​ obj 分配,而是全局 ruby​​ 内部 malloc 计数器,它在任何 ruby​​ 解释器内部 obj 分配上递增。

    【讨论】:

    • 此答案中的信息不准确。正确答案见this post
    【解决方案2】:

    正确的环境变量名称是RUBY_HEAP_MIN_SLOTS

    https://github.com/ruby/ruby/blob/v1_9_3_194/gc.c#L441

    【讨论】:

      【解决方案3】:

      在我看来 :count'lazy sweep' GC 周期数,而不是 Ruby MRI 1.9 上的 full GC 周期数.3p448。

      在分析器报告任何 GC 事件之前,我必须强制执行完整的 GC:

      GC::Profiler.enable
      GC.start
      GC::Profiler.report
      

      【讨论】:

        猜你喜欢
        • 2011-04-18
        • 1970-01-01
        • 2016-12-16
        • 2021-12-15
        • 2016-08-17
        • 2016-09-17
        • 2021-11-10
        • 2011-01-11
        • 2017-12-09
        相关资源
        最近更新 更多