java.lang.OutOfMemoryError:Java堆空间

时间:2009-10-06 01:46:53

标签: java jruby

在使用Jruby时,我收到了这条消息。

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

如何解决?

9 个答案:

答案 0 :(得分:17)

TLDR:jruby -J-Xmx1024m script_you_want_to_run.rb

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

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

-Xmx是max memory的参数,1024m是内存大小(最后m为兆字节)。我认为JRuby已经启动了JVM,最大内存已经设置为512m,所以你可能想要比这更高。

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

jruby -J-Xmx1024m script_you_want_to_run.rb

我也同意内存泄漏的情绪:如果你没有真正处理大量的对象而期望你可能会看到这个错误,那么你可能想看看你的程序是否有意外的可能性副作用。

答案 1 :(得分:10)

设置JRUBY_OPTS是最适合我的解决方案。在Koray的回答中提到过。

set JRUBY_OPTS=-J-Xmx2g

答案 2 :(得分:9)

您可以使用-Xmx-Xms JVM选项调整JVM堆大小:-Xmx表示最大堆大小,-Xms表示初始堆大小。 E.g:

java -Xms128m -Xmx256m BigApp

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

在你的情况下,很难说如何在没有更多关于你正在做什么的信息的情况下调整JVM的大小,当问题发生时......或者你可能只是在某个地方发生了内存泄漏并且增加了堆大小。帮助,它只会使问题发生在以后。在这种情况下,唯一的解决方案是修复泄漏。

最后并非最不重要的是,请始终牢记堆越大,主要GC 越长。

答案 3 :(得分: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。 e.g。

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>

答案 4 :(得分:3)

增加堆转储大小可能只是一个创可贴。您需要通过添加适当的适当参数来生成堆转储:

java -XX:+HeapDumpOnOutOfMemoryError -mn256m -mx512

这将生成类似于java _ * .hprof的文件。然后,您可以使用一组开源工具来分析堆转储。 Java 1.6附带了JHat,这是一种有缺陷的并且不能很好地分析大堆。我使用这个很棒的Eclipse插件:Eclipse Memory Analyzer

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

答案 5 :(得分:2)

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

java -Xmx512m MyClass

答案 6 :(得分:1)

要么你正在泄漏内存而你需要找到原因,或者你需要为Java提供更多的堆空间:

java -Xmx512m ...

答案 7 :(得分:1)

消息“Java堆空间”表示无法在Java堆中分配新对象。该错误不一定意味着应用程序内存泄漏。问题可能与配置问题一样简单,其中指定的堆大小(或默认大小,如果未指定)对于应用程序来说是不够的。

此错误和解决方案的潜在来源:http://www.blogsoncloud.com/jsp/techSols/java-lang-OutOfMemoryError-Java-heap-space.jsp

答案 8 :(得分:0)

我遇到了类似的问题,谷歌搜索几个小时后找不到满意的解决方案。如果您只需要设置Xms和Xmx参数,这对我有用:

ps aux | grep java

找出jruby实际运行的内容。杀死它(kill -9 process_id)。使用命令行上的本机Java选项重新运行该命令。

希望它有所帮助。

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

感谢。