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_num
是heap_final_num
? 什么是heap_increment
? heap_length
是最小堆大小吗?
我正在摆弄RUBY_MIN_HEAP_SLOTS
, RUBY_FREE_MIN
和RUBY_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
。
它在我看来:count是‘lazy sweep’GC循环的数量,而不是Ruby MRI 1.9.3p448上的完整GC循环。
在分析器报告任何GC事件之前,我不得不强制使用完整的GC:
GC::Profiler.enable GC.start GC::Profiler.report