在抛出OutOfMemoryError时将JVM设置为转储堆

l0r*_*c10 8 java java-ee

我正在尝试设置我正在处理的服务器的JVM,因此它会在发生OOME时将堆转储到文件中.

我知道我必须在-XX:-HeapDumpOnOutOfMemoryError某处向JVM参数添加此选项,但我无法知道如何执行此操作.

仅供参考,我可以通过PuTTY访问服务器,所以我正在寻找一种命令行方式.

我使用的JVM是OpenJDK64-Bit Server VM.

我不知道这是否相关,但应用程序是一个war文件.

PS : ps -ef|grep java

tomcat   23837     1  0 Mar25 ?        00:03:46 /usr/lib/jvm/jre/bin/java -classpath :/usr/share/tomcat6/bin/bootstrap.jar:/usr/share/tomcat6/bin/tomcat-juli.jar:/usr/share/java/commons-daemon.jar -Dcatalina.base=/usr/share/tomcat6 -Dcatalina.home=/usr/share/tomcat6 -Djava.endorsed.dirs= -Djava.io.tmpdir=/var/cache/tomcat6/temp -Djava.util.logging.config.file=/usr/share/tomcat6/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager org.apache.catalina.startup.Bootstrap start
Run Code Online (Sandbox Code Playgroud)

编辑:

我找到了一些东西,如果我错了就纠正我:因为我使用的是Tomcat,所以我决定在tomcat.conf文件中添加这些行:

JAVA_OPTS = -XX:-HeapDumpOnOutOfMemoryError

JAVA_OPTS = -XX:HeapDumpPath = /根/转储

JAVA_OPTS = -Xmx20m

你怎么看 ?

Coo*_*ans 26

HotSpot VM 选项中的此选项.我认为它在OpenJDK VM中是相同的,但如果不是,请告诉我.

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=<path to dump file>

如果您知道进程ID,也可以使用jmap手动生成内存映射:

jmap -J-d64 -dump:format=b,file=<path to dump file> <jvm pid>

您可以使用JHat来分析转储.

jhat <path to dump file>


小智 6

正如@CoolBeans所提到的,要使用的JVM选项是:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=<path to dump file>
Run Code Online (Sandbox Code Playgroud)

要在tomcat中进行设置,请在TOMCAT_HOME/bin目录下创建名为setenv.sh(setenv.bat for windows)的文件并添加以下行

export CATALINA_OPTS="$CATALINA_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=<path to dump file>"
Run Code Online (Sandbox Code Playgroud)

CATALINA_OPTS是这类选项的首选,因为它们不需要应用于关闭过程.