Ruby垃圾收集

你什么时候在Ruby程序中使用这个垃圾收集方法?

GC.start 

有时候需要开始它,但通常它本身工作正常。 我有一种情况,如果不加以控制,应用程序将咀嚼1GB内存,深入推入交换,触发GC.start间歇性地将其削减到100MB。

麻烦的是调用这种方法非常昂贵,并且如果积极使用,可能会大大降低应用程序的速度。

何时进行基准测试

我正在对一些创建大量对象的代码进行基准测试,我注意到我的基准测试变化很大。 我确定尖峰来自我的基准测试期间运行的垃圾收集

手动控制过程为我提供了更一致的基准。

 def without_gc GC.start # start out clean GC.disable yield GC.enable end without_gc do Benchmark.measure { some_code } end 

也就是说,如果重复运行GC.start会导致显着的减速。

我在内存受限环境(Heroku)上迭代大量项目时使用它 – 我强制GC.start每100个项目左右。

除非你有特殊需要,否则通常会气馁。 防爆。 有时在记忆分析期间强制gc以获得更好的可预测性是有用的。

真人生活的例子:

在测试JSON流媒体时,我想确保内存消耗仍然很低。 因此,我需要在GC.start之前运行GC.start ,否则它们会变得不可预测,甚至会产生误报。

当加载具有100k行的CSV时,这是必须的。 否则,服务器内存不足,数据无法加载。 请参阅https://stackoverflow.com/a/52722689/6594668