在使用JRuby时,我收到了这个消息。
Complete Java stackTrace
java.lang.OutOfMemoryError: Java heap space
如何解决?
简而言之,使用命令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
我也同意内存泄漏的看法:如果您没有真正处理大量对象并期望可能会看到此错误,则可能需要考虑您的程序是否具有意外的副作用。
设置 JRUBY_OPTS
是对我最有效的解决方案。这是在 Koray 的答案中提到的。
set JRUBY_OPTS=-J-Xmx2g
-Xmx
和 -Xms
JVM 选项来调整JVM堆大小: -Xmx
表示最大堆大小,-Xms
表示初始堆大小。例如:java -Xms128m -Xmx256m BigApp
我通常使用相同的设置来设置初始堆和最大堆大小。
在你的情况下,很难说如何调整JVM的大小,除非有更多关于你正在做什么、问题何时发生等方面的信息。或者你可能只是有一个内存泄漏,增加堆大小并不能帮助解决问题,只会让问题更晚出现。在这种情况下,唯一的解决方法是修复泄漏。
最后但并非最不重要的是,始终记住:堆越大,主GC时间就越长。
使用以下命令检查jruby的JVM版本:
jruby -v
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]
set JAVA_HOME=C:\Program Files\Java\jdk1.7.0_09
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增加堆转储大小可能只是一种权宜之计。您需要添加正确的参数来生成堆转储:
java -XX:+HeapDumpOnOutOfMemoryError -mn256m -mx512
您可以在命令行上将最大堆大小设置为更大的值:
java -Xmx512m MyClass
“Java heap space”这个消息表示Java堆中无法分配新对象。该错误并不一定意味着应用程序存在内存泄漏。问题可能只是一个配置问题,指定的堆大小(如果未指定,则为默认大小)对于应用程序来说不足。
此错误的潜在来源和解决方案:http://www.blogsoncloud.com/jsp/techSols/java-lang-OutOfMemoryError-Java-heap-space.jsp
你可能存在内存泄露问题,需要找出原因;或者需要给Java分配更多的堆空间:
java -Xmx512m ...
我遇到了类似的问题,在谷歌上搜索了几个小时后,仍然找不到令人满意的解决方案。如果你只需要设置Xms和Xmx参数,这是对我有效的方法:
ps aux | grep java
找出实际运行jruby的进程并杀掉它(kill -9 process_id)。在命令行上使用本机Java选项重新运行命令。
希望能有所帮助。
顺便说一下,我正在使用Jruby on Rails 4.0的Puma服务器,如果有人知道更优雅的解决方案,请告诉我。我已经尝试了所有方法(after_use_hook、.rvmrc、.bashrc等等)。
谢谢。