【问题标题】:What's the meaning of each hash value in ObjectSpace.count_objects?ObjectSpace.count_objects 中每个哈希值的含义是什么?
【发布时间】:2013-07-27 08:37:25
【问题描述】:

在 ruby​​ 1.9.3 中,我使用 ObjectSpace 来检查内存问题。 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,但还没有好的答案。

【问题讨论】:

标签: ruby-on-rails ruby objectspace


【解决方案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)时,计数没有改变。这可能意味着它只是偶尔重新评估总数,而不是实时。

但是,通过一些数学运算,当我对这些值求和并删除 TOTAL 计数时,我得到了 TOTAL。因此,当count_objects 报告对象的数量时,它看起来像是对象数量的计数。

【讨论】:

  • 谢谢vgoff,你现在知道Total和Free是什么意思了吗?另外,如果您不创建哈希或数组,为什么它们的数量会不断变化?
  • 您确定您调用的方法不会在其实现中创建 Array 或 Hash 对象吗? free,我没看过,也许是一个count被释放了,准备GC了?纯属猜测,虽然是免费的。
  • 我的意思是在你的例子中你只创建一个类,对吧?不是数组或哈希,但它们不断变化。也许 GC 正在工作?
  • 也许管家和报告的行为正在创建这些项目。甚至 object_count 也会创建一个散列来报告这些信息,对吧?当然,这将需要一些代码潜水才能深入了解它。
猜你喜欢
  • 1970-01-01
  • 2018-08-23
  • 2019-04-09
  • 2015-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-17
相关资源
最近更新 更多