ruby - 在 ruby​​ 中运行手动 GC 是好习惯吗

标签 ruby garbage-collection

我在 Google 上读到很多关于 ruby​​ 不会将内存释放回操作系统的信息,我也理解这一点,因为从操作系统分配内存是一个代价高昂的公平过程。

这让我问这个问题

如果开发人员希望 Ruby 将内存从 Ruby 释放回操作系统,他们该怎么做。

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

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

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

谁能推荐一下。上述解决方案是否适合生产。

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

注:Ruby 版本 2.2.2 MRI Centos 4G 内存,4 核。

这就是问题 http://pastebin.com/rYdYwxLJ 的原因

最佳答案

I read quite a lot on Google that ruby does not release back memory to the OS and I understand the as well because allocating memory from OS is a costly fair.

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

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

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

If a developer want the Ruby to release the memory back to OS from ruby how do they do it.

你不知道。实现要么将内存释放回操作系统,在这种情况下您不需要做任何事情,要么它不将内存释放回操作系统,在这种情况下您不能做任何事情。

- I guess the answer is manually triggering a GC in Ruby.

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

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

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

But is it advisable to do (run manual GC) on a production application.

几乎从来没有。 GC 比您更了解现在运行还是稍后运行是否有意义。

Note: I think I also know GC.start (means stop the whole world in Ruby)

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

Note: Ruby Version 2.2.2

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

关于ruby - 在 ruby​​ 中运行手动 GC 是好习惯吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38658067/

相关文章:

ruby - 使用 Ruby 中的 Selenium WebDriver 将 IE9 更改为 IE8

java - 堆栈上的堆分配(使用堆栈作为堆管理系统)

java - 是否收集了 lambda 垃圾?

go - 循环中的变量会被垃圾收集还是保留在内存中?

ruby-on-rails - 第一个 Rails 项目 : Rake Problem

ruby - 如何将哈希保存到 Sequel DB?

java - 优化 Tomcat/垃圾收集

java - android中奇怪的内存分配

ruby - 'json"gem 和 'json_pure' gem 有什么区别?

ruby - 如何执行在捕获输出时以彩色打印但也可以在 Ruby 中取消的系统命令?