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

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

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

我正在使用Ruby 1.9.3。

: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分配上递增。

正确的环境变量名称是RUBY_HEAP_MIN_SLOTS

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

它在我看来:count‘lazy sweep’GC循环的数量,而不是Ruby MRI 1.9.3p448上的完整GC循环。

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

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