java.lang.OutOfMemoryError:java堆空间
在使用Jruby时,我得到了这个消息java.lang.OutOfMemoryError:java堆空间,java,jruby,Java,Jruby,在使用Jruby时,我得到了这个消息 Complete Java stackTrace java.lang.OutOfMemoryError: Java heap space 如何解决?您可以在命令行上将最大堆设置为更大的大小: java -Xmx512m MyClass 您可能正在泄漏内存,需要找出原因,或者需要为Java提供更多堆空间: java -Xmx512m ... 您可以使用-Xmx和-XmsJVM选项调整JVM堆大小:-Xmx用于最大堆大小,-Xms用于初始堆大小。例如: j
Complete Java stackTrace
java.lang.OutOfMemoryError: Java heap space
如何解决?您可以在命令行上将最大堆设置为更大的大小:
java -Xmx512m MyClass
您可能正在泄漏内存,需要找出原因,或者需要为Java提供更多堆空间:
java -Xmx512m ...
您可以使用
-Xmx
和-Xms
JVM选项调整JVM堆大小:-Xmx
用于最大堆大小,-Xms
用于初始堆大小。例如:
java -Xms128m -Xmx256m BigApp
我通常对初始堆大小和最大堆大小使用相同的设置
在您的情况下,如果没有更多关于您正在做什么的信息,当问题发生时,很难说出如何调整JVM的大小。。。或者,您可能只是在某个地方发生了内存泄漏,而增加堆大小也无济于事,只会使问题在以后发生。在这种情况下,唯一的解决办法是修复泄漏
最后一点,始终记住堆越大,GC的长度越长。
增加堆转储大小可能只是一个助带。您需要通过添加适当的参数来生成堆转储:java -XX:+HeapDumpOnOutOfMemoryError -mn256m -mx512
这将生成一个类似于java*.hprof的文件。然后,您可以使用一组开源工具来分析堆转储。Java1.6附带JHat,这是一种缺陷,不能很好地分析大型堆。我使用这个很棒的Eclipse插件:
从堆转储生成报告后,您可以查看哪些类占用的内存最多,并可以将其作为调试代码以查找内存泄漏的起点。TLDR:
jruby-J-Xmx1024m script\u you\u想要运行的脚本。rb
正如其他人提到的,您的程序试图分配的内存超过JVM允许分配的最大大小
另外,正如其他人所提到的,您可以通过命令行使用参数-Xmx1024m(作为一个示例)告诉Java允许更多内存分配
-Xmx是max memory的参数,1024m将是内存大小(最后m表示兆字节)。我认为JRuby在启动JVM时已经将最大内存设置为512m,所以您可能会希望达到更高的值
要使用jruby从命令行将参数发送到JVM,需要在参数前面添加-J,因此命令行如下所示:
jruby -J-Xmx1024m script_you_want_to_run.rb
我也同意内存泄漏的观点:如果你不是真的在处理大量的对象时期望看到这个错误,那么你可能想研究一下你的程序是否有意外的副作用。消息“Java堆空间”指示无法在Java堆中分配新对象。该错误不一定意味着应用程序内存泄漏。这个问题可能像配置问题一样简单,其中指定的堆大小(或默认大小,如果未指定)对于应用程序来说是不够的
此错误的潜在来源和解决方案:使用此命令检查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>
jruby-J-Xmx2g
设置JRUBY\u选项
是最适合我的解决方案。科雷的回答中提到了这一点
set JRUBY_OPTS=-J-Xmx2g
我遇到了一个类似的问题,在谷歌搜索了几个小时后,我找不到满意的解决方案。如果您只需要设置Xms和Xmx参数,那么以下是适合我的方法: ps aux| grep java 找出jruby实际运行的是什么。杀死它(杀死-9进程id)。使用命令行上的本机Java选项重新运行该命令 希望能有帮助 顺便说一句,我正在使用puma服务器和Rails 4.0上的Jruby,如果有人知道更优雅的解决方案,请告诉我。我已经尝试了一切(在使用了hook、.rvmrc、.bashrc等之后)
谢谢。您可能希望在堆上分配更少的对象。你能发布一段代码片段,让我们了解你想要执行的代码吗?我还需要
-S
标志,例如jruby-J-Xmx2g-S rails S S puma
你说的“本机java选项”是什么意思?