我正在使用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_SLOTS
,RUBY_FREE_MIN
和RUBY_GC_MALLOC_LIMIT
,但更改这些env vars似乎对:heap_count
或{{1}没有任何影响}。如果我从根本上增加最小堆插槽,我会期望:heap_length
会下降。所以我真的想知道所有:heap_count
值代表什么!
我正在使用Ruby 1.9.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
。
答案 2 :(得分:0)
在我看来,:count 是在Ruby MRI 1.9上'lazy sweep' GC周期的数量,而不是完整的GC 周期.3p448。
在分析器报告任何GC事件之前,我必须强制使用完整的GC:
GC::Profiler.enable
GC.start
GC::Profiler.report