Java堆空间溢出错误:java.lang.OutOfMemoryError。

16

在使用JRuby时,我收到了这个消息。

Complete Java stackTrace
java.lang.OutOfMemoryError: Java heap space

如何解决?


你可能想在堆上分配更少的对象。你能发一段代码片段让我们理解你试图执行的代码吗? - Brian Lyttle
9个回答

18

简而言之,使用命令jruby -J-Xmx1024m script_you_want_to_run.rb

正如其他人所提到的,您的程序正在尝试分配比JVM允许的最大大小还要多的内存。

正如其他人所提到的,您可以通过使用命令行参数-Xmx1024m(例如)告诉Java允许更多的内存分配来配置Java。

-Xmx是最大内存的参数,1024m是内存大小(最后的m代表兆字节)。我想JRuby已经将JVM的最大内存设置为512m,因此您可能需要将其增加到更高。

要使用jruby从命令行向JVM发送参数,您需要在参数前面添加-J,因此您的命令行将如下所示:

jruby -J-Xmx1024m script_you_want_to_run.rb

我也同意内存泄漏的看法:如果您没有真正处理大量对象并期望可能会看到此错误,则可能需要考虑您的程序是否具有意外的副作用。


10

设置 JRUBY_OPTS 是对我最有效的解决方案。这是在 Koray 的答案中提到的。

set JRUBY_OPTS=-J-Xmx2g

9
您可以使用 -Xmx-Xms JVM 选项来调整JVM堆大小: -Xmx 表示最大堆大小,-Xms 表示初始堆大小。例如:
java -Xms128m -Xmx256m BigApp

我通常使用相同的设置来设置初始堆和最大堆大小。

在你的情况下,很难说如何调整JVM的大小,除非有更多关于你正在做什么、问题何时发生等方面的信息。或者你可能只是有一个内存泄漏,增加堆大小并不能帮助解决问题,只会让问题更晚出现。在这种情况下,唯一的解决方法是修复泄漏。

最后但并非最不重要的是,始终记住:堆越大,主GC时间就越长


4

使用以下命令检查jruby的JVM版本:

jruby -v

如果返回此字符串,则表示您正在使用32位JVM,因此无法将最大堆大小设置为> = 2GB。
jruby 1.7.3 (1.9.3p385) 2013-02-21 dac429b on Java HotSpot(TM) Client VM 1.6.0_37-b06 [Windows 7-x86]

您需要将JAVA_HOME设置为您的64位Java版本。例如:
set JAVA_HOME=C:\Program Files\Java\jdk1.7.0_09

如果您再次运行jruby -v命令,将会看到以下输出结果。
jruby 1.7.3 (1.9.3p385) 2013-02-21 dac429b on Java HotSpot(TM) 64-Bit Server VM 1.7.0_09-b05 [Windows 7-amd64]

您可以看到,您现在正在使用64位版本的JVM。之后,您可以按照以下方式设置jruby opts环境参数。

set JRUBY_OPTS=-J-Xmx2g

或者您可以按照以下方式运行您的程序

jruby -J-Xmx2g <your ruby program>

我也需要使用 -S 参数,例如 jruby -J-Xmx2g -S rails s puma - Kris

3

增加堆转储大小可能只是一种权宜之计。您需要添加正确的参数来生成堆转储:

java -XX:+HeapDumpOnOutOfMemoryError -mn256m -mx512

这将生成一个类似于java_*.hprof的文件。您可以使用各种开源工具来分析堆转储。Java 1.6附带了JHat,它有点不稳定,并且无法很好地分析大的堆。我使用这个很棒的Eclipse插件:Eclipse Memory Analyzer

生成堆转储报告后,您可以查看哪些类占用了最多的内存,并将其作为调试代码以查找任何内存泄漏的起点。

2

您可以在命令行上将最大堆大小设置为更大的值:

java -Xmx512m MyClass

1

1

你可能存在内存泄露问题,需要找出原因;或者需要给Java分配更多的堆空间:

java -Xmx512m ...

0

我遇到了类似的问题,在谷歌上搜索了几个小时后,仍然找不到令人满意的解决方案。如果你只需要设置Xms和Xmx参数,这是对我有效的方法:

ps aux | grep java

找出实际运行jruby的进程并杀掉它(kill -9 process_id)。在命令行上使用本机Java选项重新运行命令。

希望能有所帮助。

顺便说一下,我正在使用Jruby on Rails 4.0的Puma服务器,如果有人知道更优雅的解决方案,请告诉我。我已经尝试了所有方法(after_use_hook、.rvmrc、.bashrc等等)。

谢谢。


“Native Java选项”是什么意思? - Richardsondx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接