什么意思:在ObjectSpace.count_中释放ruby MRI上的对象

什么意思:在ObjectSpace.count_中释放ruby MRI上的对象,ruby,Ruby,我想知道从ObjectSpace.count\u object返回的与键:FREE关联的计数是多少。文档中说这个散列是特定于实现的,所以我的问题特别提到MRI ruby 2.1 关于这个(和)至少有两个问题,但没有关于:FREE的答案 有什么想法吗 在某些情况下,空闲计数远远高于通过ObjectSpace访问的对象数。每个对象都是,因此我似乎没有关于它们的任何信息。它们正在占用内存。在我的程序中,即使在运行垃圾收集之后,:FREE计数也很高 我们可以直接从实现本身(从)中找到:FREE的含义 然

我想知道从
ObjectSpace.count\u object
返回的与键
:FREE
关联的计数是多少。文档中说这个散列是特定于实现的,所以我的问题特别提到MRI ruby 2.1

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

有什么想法吗


在某些情况下,空闲计数远远高于通过
ObjectSpace访问的对象数。每个对象都是
,因此我似乎没有关于它们的任何信息。它们正在占用内存。在我的程序中,即使在运行垃圾收集之后,
:FREE
计数也很高

我们可以直接从实现本身(从)中找到
:FREE
的含义

然后,我们可以查看它的测试(从中):

最后,我们可以再次确认,没有什么有趣的事情发生:
GC.stat[:heap\u free\u slot]==ObjectSpace.count\u objects[:free]

irb(main):001:0>GC.stat[:heap\u free\u slot]==ObjectSpace.count\u对象[:free]
=>正确


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

我记得,MRI的GC在清理时实际上不会释放已分配的对象。而是将未使用的对象收集到一个链表中。这些对象将根据需要回收为新对象。这减少了需要完成的实际分配/释放量。我猜
: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.
assert_equal(count[:TOTAL]-count[:FREE], stat[:heap_live_slots])
assert_equal(count[:FREE], stat[:heap_free_slots])