我在 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 版本 2.2.2
这不是有趣的地方。有趣的问题是您使用的是哪个实现、哪个垃圾收集器以及哪个操作系统。 (当然还有所有这些的版本和配置设置。)