使用HeapDumpOnOutOfMemoryError参数进行JBoss的堆转储


182

有人告诉我可以在-XX:+HeapDumpOnOutOfMemoryError我的JBoss启动脚本中将参数添加到JVM启动选项中,以在我们的应用程序出现内存不足错误时进行堆转储。我想知道这些数据在哪里转储?它只是到控制台还是一些日志文件?如果只是控制台,如果我没有通过控制台登录Unix服务器怎么办?


1
我想那是当前文件夹。
Valentin Tihomirov 2015年

Answers:


246

这是Oracle文档必须说的:

默认情况下,堆转储在VM的工作目录中的一个名为java_ pid .hprof 的文件中创建,如上例所示。您可以使用该-XX:HeapDumpPath=选项指定备用文件名或目录。例如,-XX:HeapDumpPath=/disk2/dumps 将导致在/disk2/dumps 目录中生成堆转储。


16
:这也列出了所有虚拟机的性能相关的选项java.sun.com/javase/technologies/hotspot/...
拉维古普塔

4
重要!HeapDump标志仅在Java 1.5.0_07中可用。
rustyx 2012年

14
同样重要的是要认识到JVM不会覆盖中的现有堆转储HeapDumpPath,您会"Unable to create /tmp/java_pidpid.hprof: File exists"在标准输出中看到类似的内容。确保将转储文件移出转储路径,以清除将来的任何转储文件;并使用<pid>文件名中的占位符来增加文件名中的熵。
2013年

1
这非常有用。使用Eclipse Memory Analyzer只需几分钟就可以找到泄漏。
Aron Lorincz

如果我们给系统中不存在的文件夹提供路径会怎样?它会创建文件夹并在该文件夹中推送驼峰转储吗?
Vinit89 '18

47

您可以从UNIX控制台查看此转储。

堆转储的路径将在您放置提到的变量之后立即作为变量提供。

例如:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${DOMAIN_HOME}/logs/mps"

您可以从控制台在提到的路径上查看转储。


4

我发现很难理解“ VM的工作目录”的含义。在我的示例中,我使用Java Service Wrapper程序执行一个jar-转储文件是在放置包装程序的目录中创建的,例如c:\ myapp \ bin。我发现这的原因是因为文件可能很大,并且在我发现位置之前它们已填满硬盘。


您的工作目录可以通过pwdx <PID>命令找到。首先做一个ps -ef | grep java,找到您的Java应用程序的PID,然后运行pwdx <PID>。它会告诉您工作目录。
RCG '18

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.