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