Java 为JBoss的堆转储使用HeapDumpOnOutOfMemoryError参数

Java 为JBoss的堆转储使用HeapDumpOnOutOfMemoryError参数,java,jboss,memory-leaks,heap,Java,Jboss,Memory Leaks,Heap,有人告诉我,我可以将-XX:+HeapDumpOnOutOfMemoryError参数添加到我的JVM启动选项和JBoss启动脚本中,以便在我们的应用程序中出现内存不足错误时获得堆转储。我想知道这些数据是从哪里转储的?它只是到控制台,还是到某个日志文件?如果只是到控制台,如果我没有通过控制台登录到Unix服务器怎么办?下面是我要说的: 默认情况下,堆转储是在中创建的 中名为java_pid.hprof的文件 虚拟机的工作目录,如 上面的例子。您可以指定 替代文件名或目录 使用-XX:HeapDu

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

下面是我要说的:

默认情况下,堆转储是在中创建的 中名为java_pid.hprof的文件 虚拟机的工作目录,如 上面的例子。您可以指定 替代文件名或目录 使用
-XX:HeapDumpPath=
选项。对于 示例
-XX:HeapDumpPath=/disk2/dumps
将导致堆转储失败 在
/disk2/dumps中生成
目录


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

堆转储的路径将作为变量提供,就在您放置上述变量的位置之后

例如:


您可以从控制台中的上述路径查看转储。

我发现很难理解“VM的工作目录”是什么意思。在我的示例中,我使用Java服务包装程序执行一个jar—转储文件是在我放置包装程序的目录中创建的,例如c:\myapp\bin。我发现这一点的原因是,这些文件可能非常大,在我发现它们的位置之前,它们已经填满了硬盘

如果您没有使用“-XX:HeapDumpPath”选项,那么在JBoss EAP/As默认情况下,堆转储文件将在“JBoss_HOME/bin”目录中生成。

这还列出了所有与VM性能相关的选项:重要!HeapDump标志仅在Java 1.5.0_07中可用。另外,必须认识到JVM不会覆盖
HeapDumpPath
中的现有堆转储,您将在标准输出中看到类似于
“无法创建/tmp/Java_pidpid.hprof:文件存在”
。确保将转储文件移出转储路径,以便为将来的任何转储文件扫清道路;并利用文件名中的
占位符来增加文件名中的熵。这非常有用。用Eclipse内存分析器只花了几分钟就找到了漏洞。如果我们给出了系统中不存在的文件夹的路径,会发生什么?它会创建文件夹并将驼峰转储推到该文件夹中吗?我想这是当前文件夹。您的工作目录可以通过pwdx命令找到。首先做一个ps-ef | grep java,找到java应用程序的PID,然后运行pwdx。它会告诉你工作目录。
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${DOMAIN_HOME}/logs/mps"