Ruby垃圾回收

35

你什么时候会在自己的Ruby程序中使用这种垃圾回收方法?

GC.start

请参考 https://dev59.com/I3NA5IYBdhLWcg3wcddk#959473 了解使用 rmagick 的用例。其中包括了一个很好的解释,为什么 Ruby 在垃圾回收方面存在问题。 - knut
6个回答

28

有时候需要启动GC垃圾回收,但通常情况下它会自行正常工作。我曾经遇到过这样的情况,如果未受控制地运行,一个应用程序将消耗1GB内存,并深入到交换空间,而间歇性地触发GC.start将把内存占用降至100MB。

问题在于,调用此方法非常昂贵,如果过度使用,可能会严重减慢您的应用程序。


27

当进行基准测试时

我正在对创建大量对象的某些代码进行基准测试,我注意到我的基准测试结果差异很大。我确定峰值是由于垃圾回收在我的基准测试期间运行造成的。

手动控制过程可以给我更一致的基准测试结果。

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,将会导致显著的减速。


15

我在内存受限的环境(Heroku)中遍历大量数据时使用它 - 大约每100个数据就会强制执行GC.start


7

通常不建议使用,除非您有特殊需求。例如,在内存分析过程中,有时会强制进行垃圾回收以获得更好的可预测性。


3

1

实际例子:

测试JSON流处理器时,我希望确保内存消耗保持较低。因此,在运行测试用例之前,我需要运行GC.start,否则它们会变得不可预测,甚至可能产生错误的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接