我想知道从ObjectSpace.count_object
返回的与密钥:FREE
相关的计数是多少。文档中说这个散列是特定于实现的,所以我的问题特别提到MRI ruby 2.1。
至少有两个问题(这里和这里),但没有关于:FREE
的答案。
有什么想法吗?
在某些情况下,空闲计数远高于通过ObjectSpace.each_object
可访问的对象数,因此我似乎没有任何关于它们的信息。它们会占用内存吗。在我的程序中,即使在运行垃圾收集之后,:FREE
计数也很高。
我们可以直接从实现本身(从gc.c)中找到:FREE
的含义
* 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
表示堆上尚未使用的已分配插槽的数量。