java.lang.OutOfMemoryError:Java堆空间

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

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

怎么解决?

TLDR: jruby -J-Xmx1024m script_you_want_to_run.rb

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

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

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

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

 jruby -J-Xmx1024m script_you_want_to_run.rb 

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

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

 java -Xms128m -Xmx256m BigApp 

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

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

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

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

 set JRUBY_OPTS=-J-Xmx2g 

使用此命令检查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  

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

 java -XX:+HeapDumpOnOutOfMemoryError -mn256m -mx512 

这将生成类似于java _ * .hprof的文件。 然后,您可以使用一组开源工具来分析堆转储。 Java 1.6随JHat一起发布,它有点像bug,并且不能很好地分析大堆。 我使用这个很棒的Eclipse插件: Eclipse Memory Analyzer 。

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

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

 java -Xmx512m MyClass 

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

 java -Xmx512m ... 

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

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

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

ps aux | grep java

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

希望能帮助到你。

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

谢谢。