我正在开发一个具有finalizer方法的类。为了测试该类,我想运行垃圾收集器,然后测试一些状态以查看是否一切正常。但是,我似乎实际上并没有收集到垃圾,因此最终确定要等到脚本结束才进行。以下代码显示了该问题。
class FinalCall
def initialize
ObjectSpace.define_finalizer(self, proc { puts 'finalizing' })
end
end
FinalCall.new
GC.start
puts 'done'
我曾期望这样的输出:
finalizing
done
但是我实际上得到了这个:
done
finalizing
我想念什么?您如何强制GC完成超出范围的所有操作?
最佳答案
GC.start
不能保证垃圾收集器将运行。仅建议您,如果在此特定时间发生GC,您的代码就可以了。要求GC在特定的时间点运行会不合理地限制实现者。例如,由于GC不受实现者的控制,因此不可能为JVM,CLI或ECMAScript或PyPy平台编写Ruby实现,也不能使用诸如Eclipse OMR之类的框架。
无法保证何时会发生GC。甚至无法保证将发生GC。
因此,也不能保证终结器何时运行甚至是否运行。
关于ruby - GC.start似乎并没有真正收集垃圾,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59558066/