你什么时候会在自己的Ruby程序中使用这种垃圾回收方法?
GC.start
你什么时候会在自己的Ruby程序中使用这种垃圾回收方法?
GC.start
有时候需要启动GC垃圾回收,但通常情况下它会自行正常工作。我曾经遇到过这样的情况,如果未受控制地运行,一个应用程序将消耗1GB内存,并深入到交换空间,而间歇性地触发GC.start
将把内存占用降至100MB。
问题在于,调用此方法非常昂贵,如果过度使用,可能会严重减慢您的应用程序。
我正在对创建大量对象的某些代码进行基准测试,我注意到我的基准测试结果差异很大。我确定峰值是由于垃圾回收在我的基准测试期间运行造成的。
手动控制过程可以给我更一致的基准测试结果。
def without_gc
GC.start # start out clean
GC.disable
begin
yield
ensure
GC.enable
end
end
without_gc do
Benchmark.measure { some_code }
end
话虽如此,如果您反复运行GC.start
,将会导致显著的减速。
我在内存受限的环境(Heroku)中遍历大量数据时使用它 - 大约每100个数据就会强制执行GC.start
。
通常不建议使用,除非您有特殊需求。例如,在内存分析过程中,有时会强制进行垃圾回收以获得更好的可预测性。
当加载具有10万行的CSV文件时,这是必须的。否则服务器会耗尽内存,数据无法加载。
实际例子:
当测试JSON流处理器时,我希望确保内存消耗保持较低。因此,在运行测试用例之前,我需要运行GC.start
,否则它们会变得不可预测,甚至可能产生错误的结果。