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

Noo*_*bie 1 ruby garbage-collection

我在谷歌上看到很多,ruby没有向操作系统发布内存,我也理解这一点,因为从操作系统分配内存是一个代价高昂的公平.

这导致我问这个问题

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

- 我想答案是手动触发GCRuby中的一个.

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

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

谁能建议.以上解决方案是否适合生产.

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

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

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

Jör*_*tag 5

我在谷歌上看到很多,ruby没有向操作系统发布内存,我也理解这一点,因为从操作系统分配内存是一个代价高昂的公平.

这根本不是真的.Ruby语言没有任何关于将内存释放回操作系统的内容.实际上,Ruby语言并没有对内存,时期有所描述.

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

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

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

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

- 我想答案是手动触发GCRuby中的一个.

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

如果实现确实将内存释放回操作系统,那么无论您是否手动触发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版本2.2.2

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


Ale*_*kin 4

您可能误解了通过 Google 链接阅读的内容。Ruby(这里和后面我指的是 MRI 作为默认的 Ruby 实现)不会释放回 OS 的内存(所谓的 Ruby Heaps)不会释放到 OS。时期。

您无法强制 Ruby 将 Ruby 堆释放回操作系统(除了整个应用程序的冷重启之外)。

可能会释放回操作系统的内容由 Ruby 内部释放,手动调用 GC无论如何都是一种不好的做法,在 99% 的情况下会减慢应用程序的速度,在其余 1% 的情况下这不会产生任何影响全部。