我想知道与:FREE
返回的密钥ObjectSpace.count_object
相关联的计数。文档说这个哈希是特定于实现的,因此我的问题专门针对MRI ruby 2.1。
至少有两个问题(here和here),但没有关于:FREE
的答案。
有什么想法吗?
在某些情况下,免费计数远远高于ObjectSpace.each_object
可访问的对象数量,因此我似乎没有任何关于它们的信息。他们是否会占用记忆。在我的程序中,即使在运行垃圾收集之后,:FREE
计数也很高。
答案 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
表示尚未使用的堆上已分配的插槽数。