我正在开发一个具有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/

10-15 23:42