我正在使用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中,按预期方式工作(对象已被垃圾回收)。
答案 0 :(得分:0)
垃圾收集器仅在绝对必要时收集垃圾。收藏很贵。
除非您的内存不足,否则对象被垃圾回收的可能性很小。
注意:这显然高度依赖于特定的实现,特定的实现的特定版本以及您使用的特定环境。例如。 Rubinius具有与YARV完全不同的GC,后者与MRuby具有完全不同的GC。即使在 YARV中,GC在版本之间也发生了重大变化。 TruffleRuby,JRuby,IronRuby,MagLev和Opal甚至根本没有GC,它们依赖于底层平台的内存管理。
答案 1 :(得分:0)
似乎another question中已经回答了
Pry存储了最后100个命令的输出,因此实际上无法对该对象进行垃圾收集。