【发布时间】:2018-11-28 19:47:17
【问题描述】:
我正在使用 Ruby 垃圾收集器运行一些测试。当我从 Ruby 控制台运行它时,我得到了这个奇怪的行为:
class B
end
#=> nil
count = ObjectSpace.each_object(B) {|x| x }
#=> 0
b = B.new
#=> #<B:0x00007feeb7849678>
count = ObjectSpace.each_object(B) {|x| x }
#=> 1
b = nil
#=> nil
GC.start
#=> nil
count = ObjectSpace.each_object(B) {|x| x }
#=> 1
为什么会这样?
更新:我只在 PRY 中得到这种行为。在 IRB 中按预期工作(对象被垃圾收集)。
【问题讨论】:
-
从黑盒的角度来看,这似乎很正常; GC 认为不适合销毁内存中的实例。也许它正在等待执行的某个点或达到某个阈值,但无论如何,它不在你的掌控之中。
-
@ggorlen “......它不在你的手中”不一定。如果你真的想强制收集一些东西,你可以在技术上WeakRef 它,虽然绝对不推荐,因为它可能被内部 GC 而不是显式的
GC.start消耗。只需在GC.start之前添加b = WeakRef.new(b)即可导致此代码生成0 -
无法复制。您的示例代码按预期对我有用,即最后一个计数返回
0。