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



我想知道从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表示堆上尚未使用的已分配插槽的数量。

最新更新