首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ObjectSpace.count_objects中每个哈希值的含义是什么?

ObjectSpace.count_objects中每个哈希值的含义是什么?
EN

Stack Overflow用户
提问于 2013-07-27 06:40:21
回答 1查看 643关注 0票数 5

在Ruby1.9.3中,我使用ObjectSpace来检查内存问题。ObjectSpace.count_objects返回一个哈希值,如下所示:

代码语言:javascript
复制
{: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,但还没有很好的答案。

EN

回答 1

Stack Overflow用户

发布于 2013-07-27 07:18:28

代码语言:javascript
复制
>> 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对象,我们可以看到这些都是计数。当我删除类并启动垃圾收集器时,它会再次减少计数。

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

但是,通过一些数学运算,当我将这些值相加,并删除总计数时,我就得到了TOTAL。因此,它看起来像是对象数量的计数,当count_objects报告对象数量时,这是有意义的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17892125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档