java.lang.OutOfMemoryError:Java堆空间

16 java jruby

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

Complete Java stackTrace
java.lang.OutOfMemoryError: Java heap space
Run Code Online (Sandbox Code Playgroud)

怎么解决?

Sam*_*rbi 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
Run Code Online (Sandbox Code Playgroud)

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


M. *_*ord 10

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

set JRUBY_OPTS=-J-Xmx2g
Run Code Online (Sandbox Code Playgroud)


Pas*_*ent 9

您可以使用-Xmx-XmsJVM选项调整JVM堆大小:-Xmx最大堆大小和-Xms初始堆大小.例如:

java -Xms128m -Xmx256m BigApp
Run Code Online (Sandbox Code Playgroud)

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

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

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


akf*_*akf 2

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

java -Xmx512m MyClass
Run Code Online (Sandbox Code Playgroud)