2013-07-26 28 views
5

在ruby 1.9.3中,我使用ObjectSpace来检查内存问题。 ObjectSpace.count_objects返回一个散列,如下所示:ObjectSpace.count_objects中每个散列值的含义是什么?

{:TOTAL=>1004232, :FREE=>258543, :T_OBJECT=>12519, :T_CLASS=>10318, :T_MODULE=>1330,  
:T_FLOAT=>2024, :T_STRING=>555422, :T_REGEXP=>3543, :T_ARRAY=>68372, :T_HASH=>5399, 
:T_STRUCT=>542, :T_BIGNUM=>8105, :T_FILE=>10, :T_DATA=>44277, :T_MATCH=>6, :T_COMPLEX=>1, 
:T_RATIONAL=>82, :T_NODE=>31973, :T_ICLASS=>1766} 

每个散列值是什么意思?特别是,为什么:TOTAL长时间保持不变?这是否意味着没有创建新对象?

我看到一个similar posting,但没有好的答案呢。

+0

[在Ruby 1.9上,调用ObjectSpace.count \ _objects(特别是:FREE,:T \ _ICLASS,:T \ _DATA和:T \ _NODE)时,散列键的含义是什么?]( https://stackoverflow.com/questions/3789929/on-ruby-1-9-what-are-the-meanings-of-the-hash-keys-when-calling-objectspace-cou) –

回答

1
>> ObjectSpace.count_objects 
=> {:TOTAL=>30205, :FREE=>131, :T_OBJECT=>1550, :T_CLASS=>921, :T_MODULE=>31, :T_FLOAT=>7, :T_STRING=>18368, :T_REGEXP=>185, :T_ARRAY=>4 
196, :T_HASH=>254, :T_STRUCT=>1, :T_BIGNUM=>3, :T_FILE=>9, :T_DATA=>1311, :T_MATCH=>84, :T_COMPLEX=>1, :T_NODE=>3121, :T_ICLASS=>32} 
>> class MyClass ; end 
=> nil 
>> ObjectSpace.count_objects 
=> {:TOTAL=>30205, :FREE=>203, :T_OBJECT=>1562, :T_CLASS=>923, :T_MODULE=>31, :T_FLOAT=>7, :T_STRING=>18333, :T_REGEXP=>185, :T_ARRAY=>4 
274, :T_HASH=>268, :T_STRUCT=>1, :T_BIGNUM=>3, :T_FILE=>9, :T_DATA=>1320, :T_MATCH=>97, :T_COMPLEX=>1, :T_NODE=>2956, :T_ICLASS=>32} 
>> MyClass = nil 
(irb):4: warning: already initialized constant MyClass 
(irb):2: warning: previous definition of MyClass was here 
=> nil 
>> ObjectSpace.count_objects 
=> {:TOTAL=>30205, :FREE=>87, :T_OBJECT=>1572, :T_CLASS=>923, :T_MODULE=>31, :T_FLOAT=>7, :T_STRING=>18425, :T_REGEXP=>185, :T_ARRAY=>43 
39, :T_HASH=>279, :T_STRUCT=>1, :T_BIGNUM=>3, :T_FILE=>9, :T_DATA=>1328, :T_MATCH=>107, :T_COMPLEX=>1, :T_NODE=>2876, :T_ICLASS=>32} 
>> MyClass 
=> nil 
>> GC.start 
=> nil 
>> ObjectSpace.count_objects 
=> {:TOTAL=>30205, :FREE=>7356, :T_OBJECT=>1549, :T_CLASS=>921, :T_MODULE=>31, :T_FLOAT=>7, :T_STRING=>14100, :T_REGEXP=>184, :T_ARRAY=> 
3821, :T_HASH=>244, :T_STRUCT=>1, :T_BIGNUM=>3, :T_FILE=>5, :T_DATA=>1285, :T_MATCH=>8, :T_COMPLEX=>1, :T_NODE=>657, :T_ICLASS=>32} 
>> 

看着T_CLASS对象,我们可以看到这些是计数。当我删除课程并启动垃圾收集器时,它会再次减少计数。

保持不变的TOTAL值并不意味着没有创建对象,很明显当您创建一个新的对象,如MyClass时,count没有改变。这可能意味着它只是偶尔重新评估总数,而不是实时评估。

但是,有一点数学,当我总结的价值,并删除总计数,我得到总数。所以它看起来像是对象数量的计数,当count_objects报告对象的数量时,这是合理的。

+0

谢谢vgoff,你呢现在Total和Free有什么意义?另外,如果你不创建散列或数组,为什么它们的数量不断变化? –

+0

您确定您调用的方法不会在其实现中创建Array或Hash对象吗?免费,我没有看过,也许这是一个被释放并准备好GC的计数器?尽管纯粹推测虽然免费。 – vgoff

+0

我的意思是在你的例子中你只创建一个类的权利?不是数组或散列,但它们不断变化。也许GC正在工作? –