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

Java 将JVM设置为在抛出OutOfMemoryError时转储堆,java,jakarta-ee,Java,Jakarta Ee,我试图设置我正在工作的服务器的JVM,因此当OOME发生时,它会将堆转储到文件中 我知道我必须在JVM参数的某个地方添加这个选项-XX:-HeapDumpOnOutOfMemoryError,但我不知道该怎么做 仅供参考,我可以通过PuTTY访问服务器,因此我正在寻找一种命令行方式来实现这一点 我使用的JVM是OpenJDK64位服务器VM 我不知道这是否相关,但该应用程序是一个war文件 PS : ps -ef|grep java tomcat 23837 1 0 Mar25

我试图设置我正在工作的服务器的JVM,因此当OOME发生时,它会将堆转储到文件中

我知道我必须在JVM参数的某个地方添加这个选项
-XX:-HeapDumpOnOutOfMemoryError
,但我不知道该怎么做

仅供参考,我可以通过PuTTY访问服务器,因此我正在寻找一种命令行方式来实现这一点

我使用的JVM是OpenJDK64位服务器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
编辑:

我发现了一些东西,如果我错了,请纠正我:因为我使用的是Tomcat,所以我决定在Tomcat.conf文件中添加以下行:

JAVA_OPTS=-XX:-HeapDumpOnOutOfMemoryError

JAVA_OPTS=-XX:HeapDumpPath=/root/dump

JAVA_OPTS=-Xmx20m


你觉得怎么样?

这个选项来自HotSpot虚拟机。我认为在OpenJDK虚拟机中也是如此,但如果不是,请告诉我

-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=

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

jmap-J-d64-dump:format=b,file=

您可以使用来分析转储


jhat

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

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=<path to dump file>
-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=
要在tomcat中进行设置,请在tomcat_HOME/bin目录下创建一个名为setenv.sh(setenv.bat For windows)的文件,并添加以下行

export CATALINA_OPTS="$CATALINA_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=<path to dump file>"
export CATALINA_OPTS=“$CATALINA_OPTS-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=”

CATALINA_选项是此类选项的首选选项,因为它们不需要应用于停机过程。

谢谢您的回答。你的意思是我应该这样做:java-XX:+HeapDumpOnOutOfMemoryError whatever.war?顺便说一句,这些是JVM参数,这并不明显。只有@l0r3nz4cc10可以接受答案(作为问题的原始海报)。感谢语法编辑:)一个可能的(混合)解决方案是使用-XX:OnOutOfMemoryError=从java进程本身触发jmap命令。(也许更好的做法是将命令封装到一个脚本中,该脚本还将关注如何找到正确的pid)