有人告诉我,我可以将
-XX:+HeapDumpOnOutOfMemoryError
参数添加到我的 JBoss 启动脚本的 JVM 启动选项中,以便在应用程序中出现内存不足错误时获取堆转储。我想知道这些数据被转储到哪里?它只是到控制台,还是到一些日志文件?如果只是到控制台,如果我没有通过控制台登录Unix服务器怎么办?
以下是 Oracle 文档 的内容:
默认情况下,堆转储创建于 一个名为 java_pid.hprof 的文件 VM 的工作目录,如 上面的例子。您可以指定一个 替代文件名或目录 使用
选项。为了 例子-XX:HeapDumpPath=
将导致堆转储 生成于-XX:HeapDumpPath=/disk2/dumps
目录。/disk2/dumps
您可以从 UNIX 控制台查看此转储。
堆转储的路径将作为变量提供在您放置上述变量的位置之后。
例如:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${DOMAIN_HOME}/logs/mps"
您可以从控制台在上述路径上查看转储。
我发现很难理解“虚拟机的工作目录”的含义。在我的示例中,我使用 Java Service Wrapper 程序来执行 jar - 转储文件是在我放置包装程序的目录中创建的,例如c:\myapp 中。我发现这一点的原因是因为这些文件可能非常大,并且在我发现它们的位置之前它们就填满了硬盘驱动器。
如果您没有使用“-XX:HeapDumpPath”选项,那么在 JBoss EAP/As 的情况下,默认情况下,堆转储文件将在“JBOSS_HOME/bin”目录中生成。
如果只配置 -XX:+HeapDumpOnOutOfMemoryError 参数,那么对于 OpenJDK/Oracle JDK,将会在 JBOSS_HOME/bin 目录中生成 heapdump。如果您使用 IBM JDK,则 heapdump 将在 /tmp 目录下创建为 phd 文件。 -XX:HeapDumpPath 选项为我们配置自定义头泵路径位置提供了更多可行性 (-XX:HeapDumpPath=/my-custom-jboss-server-path/)。建议在您的环境中配置此参数,因为它将收集 OutOfMemory 错误的堆转储,以分析应用程序内存泄漏问题或检查应用程序中的任何大对象保留。