Ruby的GC.stat的字段是什么意思?

时间:2012-09-28 05:58:03

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

我正在使用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_incrementheap_length是最小堆大小吗?

我正在摆弄RUBY_MIN_HEAP_SLOTSRUBY_FREE_MINRUBY_GC_MALLOC_LIMIT,但更改这些env vars似乎对:heap_count或{{1}没有任何影响}。如果我从根本上增加最小堆插槽,我会期望:heap_length会下降。所以我真的想知道所有:heap_count值代表什么!

我正在使用Ruby 1.9.3。

3 个答案:

答案 0 :(得分:12)

: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进程的频率更为相关,并且不会直接影响堆数。此计数器表示在ruby运行GC后会有多少mallocs。但它甚至可以更早地被破坏。请注意,它不是ruby obj分配,它是全局ruby内部malloc计数器,在任何ruby解释器内部obj分配上递增。

答案 1 :(得分:4)

正确的环境变量名称为RUBY_HEAP_MIN_SLOTS

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

答案 2 :(得分:0)

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

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

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