是什么意思:在ruby MRI上的ObjectSpace.count_objects中是免费的

时间:2014-11-11 23:08:42

标签: ruby

我想知道与:FREE返回的密钥ObjectSpace.count_object相关联的计数。文档说这个哈希是特定于实现的,因此我的问题专门针对MRI ruby​​ 2.1。

至少有两个问题(herehere),但没有关于:FREE的答案。

有什么想法吗?

在某些情况下,免费计数远远高于ObjectSpace.each_object可访问的对象数量,因此我似乎没有任何关于它们的信息。他们是否会占用记忆。在我的程序中,即使在运行垃圾收集之后,:FREE计数也很高。

1 个答案:

答案 0 :(得分:2)

我们可以直接从实现本身找到:FREE的含义(来自gc.c

*  The keys starting with +:T_+ means live objects.
*  For example, +:T_ARRAY+ is the number of arrays.
*  +:FREE+ means object slots which is not used now.
*  +:TOTAL+ means sum of above.

然后我们可以看看它的测试(来自test_gc.rb):

assert_equal(count[:TOTAL]-count[:FREE], stat[:heap_live_slots])
assert_equal(count[:FREE], stat[:heap_free_slots])

最后,我们可以仔细检查那里没有有趣的业务: GC.stat[:heap_free_slot] == ObjectSpace.count_objects[:FREE]

irb(main):001:0> GC.stat[:heap_free_slot] == ObjectSpace.count_objects[:FREE] => true

因此,:FREE表示尚未使用的堆上已分配的插槽数。