ObjectSpace.count_objects 中每个哈希值的含义是什么? [英] What's the meaning of each hash value in ObjectSpace.count_objects?

查看:33
本文介绍了ObjectSpace.count_objects 中每个哈希值的含义是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在 ruby​​ 1.9.3 中,我使用 ObjectSpace 来检查内存问题.ObjectSpace.count_objects 返回一个散列,它看起来像:

In ruby 1.9.3, I'm using ObjectSpace to inspect the memory issue. The ObjectSpace.count_objects returns a hash, which looks like:

{: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 长时间保持不变?这是否意味着没有创建新对象?

What does each hash value mean? And especially, why does the :TOTAL stay unchanged for a long time? Does it mean no new object is created?

我看到了一个 类似的帖子,但还没有好的答案.

I saw a similar posting, but no good answer yet.

推荐答案

>> 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 对象,我们可以看到这些是计数.当我删除类并启动垃圾收集器时,它会再次减少计数.

Looking at the T_CLASS object we can see that these are counts. When I remove the class and start the Garbage Collector it reduces the count again.

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

The TOTAL value remaining unchanged can not mean that there were no objects created, as obviously when you create a new object such as MyClass that count did not change. It could mean that it only reevaluates the total occasionally, not in real time.

但是,通过一些数学运算,当我对这些值求和并删除 TOTAL 计数时,我得到了 TOTAL.所以看起来它是对象数量的计数,当 count_objects 报告对象的数量时,这是有道理的.

But, with a little bit of math, when I sum the values, and remove the TOTAL count, I get TOTAL. So it looks like it is a count of the number of objects, which makes sense, when count_objects reports on the count of objects.

这篇关于ObjectSpace.count_objects 中每个哈希值的含义是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆