Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.lang.OutOfMemoryError:java堆空间_Java_Jruby - Fatal编程技术网

java.lang.OutOfMemoryError:java堆空间

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

在使用Jruby时,我得到了这个消息

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选项”是什么意思?