13

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

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

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

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

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

我正在使用 Ruby 1.9.3。

4

3 回答 3

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

于 2012-09-28T07:12:31.617 回答
4

正确的环境变量名称是RUBY_HEAP_MIN_SLOTS.

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

于 2012-10-09T22:00:43.770 回答
0

在我看来:count“延迟扫描” GC 周期的数量,而不是Ruby MRI 1.9.3p448 上的完整 GC周期。

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

GC::Profiler.enable
GC.start
GC::Profiler.report
于 2014-03-05T02:41:47.223 回答