为什么在Ruby控制台中不收集这种简单的类垃圾?

时间:2018-11-28 19:47:17

标签: ruby garbage-collection

我正在使用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中,按预期方式工作(对象已被垃圾回收)。

2 个答案:

答案 0 :(得分:0)

垃圾收集器仅在绝对必要时收集垃圾。收藏很贵。

除非您的内存不足,否则对象被垃圾回收的可能性很小。

注意:这显然高度依赖于特定的实现,特定的实现的特定版本以及您使用的特定环境。例如。 Rubinius具有与YARV完全不同的GC,后者与MRuby具有完全不同的GC。即使在 YARV中,GC在版本之间也发生了重大变化。 TruffleRuby,JRuby,IronRuby,MagLev和Opal甚至根本没有GC,它们依赖于底层平台的内存管理。

答案 1 :(得分:0)

似乎another question中已经回答了

Pry存储了最后100个命令的输出,因此实际上无法对该对象进行垃圾收集。