在ruby中运行Manual GC是一种好习惯

时间:2016-07-29 11:48:07

标签: ruby garbage-collection

我在Google上看了很多,ruby没有向操作系统发回内存,我也理解这一点,因为从操作系统中分配内存是一个代价高昂的公平。

这导致我问这个

如果开发人员希望Ruby将内存从ruby释放回操作系统,他们是如何做到的。

- 我想答案是在Ruby中手动触发GC

但是建议在生产应用程序上执行(运行手动GC)。

我想在Celluloid中创建一个单独的线程(或Actor)来每2小时启动一次GC。

任何人都可以建议。以上解决方案是否适合生产。

注意:我想我也知道GC.start(意味着在Ruby中停止整个世界)

注意:Ruby版本2.2.2 MRI Centos 4G RAM,4核。

以下是问题http://pastebin.com/rYdYwxLJ

的原因

2 个答案:

答案 0 :(得分:5)

  

我在Google上看了很多,ruby没有向操作系统发回内存,我也理解这一点,因为从操作系统中分配内存是一个代价高昂的公平。

这根本不是真的。 Ruby语言没有任何关于将内存释放回操作系统的内容。实际上,Ruby语言并没有说明记忆,句号。

Ruby有很多不同的实现,有很多不同的内存分配器和许多不同的垃圾收集器。有些将内存释放回操作系统,有些则没有,有些在托管运行时上运行,甚至根本没有管理内存。

例如,在J9上运行的JRuby会将内存释放回操作系统。使用G1 GC,ParallelScavenge GC或ParallelOld GC在HotSpot上运行的JRuby会将内存释放回操作系统。

  

如果开发人员希望Ruby将内存从ruby释放回操作系统,他们是如何做到的。

你没有。实现将内存释放回操作系统,在这种情况下,您不需要执行任何操作,或者它不会将内存释放回操作系统,在操作系统中您无法执行任何操作。

  

- 我想答案是在Ruby中手动触发GC

如果实现没有将内存释放回操作系统,则它不会将内存释放回操作系统。周期。

如果实现 将内存释放回操作系统,那么无论您是否手动触发GC,它都会这样做。

顺便说一下:你不能在Ruby中手动触发GC。您可以建议 GC(使用GC::start),但不能触发它。

  

但是建议在生产应用程序上运行(运行手动GC)。

几乎没有。 GC比你更了解现在或以后运行是否合理。

  

注意:我想我也知道GC.start(意味着在Ruby中停止整个世界)

不,GC::start只是建议做GC。它强制GC。此外,GC并不意味着停止世界。例如。当使用Metronome GC在J9 JVM上运行JRuby或使用Pauseless GC在Azul Zing JVM上运行JRuby时,永远不会停止世界。

  

注意:Ruby Version 2.2.2

这不是有趣的一点。有趣的问题是您正在使用哪种实现,哪些垃圾收集器以及哪些操作系统。 (当然还有所有这些的版本和配置设置。)

答案 1 :(得分:2)

您可能误解了您通过Google链接阅读的内容。内存,Ruby(这里和我的意思是MRI作为默认的Ruby实现)不释放回操作系统(所谓的Ruby Heaps)没有发布到操作系统。期。

您无法强制Ruby将Ruby Heaps发布回操作系统(除了冷启动整个应用程序外。)

可能发布回操作系统的内容是由内部发布的,无论如何都是一种不好的做法手动调用GC,99%的情况会导致应用程序变慢,剩下的1%这根本没有效果。