3.2. Java 堆转储
Java 堆转储是在特定时间点创建的 JVM 堆的快照。创建和分析堆转储可用于诊断和故障排除 Java 应用程序的问题。
根据您使用的 JDK,可以为 JBoss EAP 进程创建和分析 Java 堆转储的不同方法。本节介绍 Oracle JDK 和 OpenJDK 的常见方法。
3.2.1. 使用 OpenJDK 和 Oracle JDK 创建堆转储
3.2.1.1. 创建一个按需堆转储
您可以使用 jcmd
命令为在 OpenJDK 或 Oracle JDK 上运行的 JBoss EAP 创建按需堆转储。
流程
- 确定您要从中创建堆转储的 JVM 进程 ID。
使用以下命令创建堆转储:
$ jcmd JAVA_PID GC.heap_dump -all=true FILENAME.hprof
这会以 HPROF 格式创建一个堆转储文件,通常位于
EAP_HOME
或EAP_HOME/bin
中。或者,您可以指定到另一个目录的文件路径。
3.2.1.2. 在 OutOfMemoryError 上自动创建一个堆转储
您可以使用 -XX:+HeapDumpOnOutOfMemoryError
JVM 选项在引发 OutOfMemoryError
异常时自动创建堆转储。
这会以 HPROF 格式创建一个堆转储文件,通常位于 EAP_HOME
或 EAP_HOME/bin
中。或者,您可以使用 -XX:HeapDumpPath=/path/
为堆转储设置自定义路径。如果您使用 -XX:HeapDumpPath
指定文件名,例如 -XX:HeapDumpPath=/path/filename.hprof
,堆转储将相互覆盖。
3.2.2. 分析堆转储
3.2.2.1. Heap dump 分析工具
有很多工具可以分析堆转储文件并帮助识别问题。红帽支持建议使用 Eclipse Memory Analyzer 工具(MAT),它可以分析以 HPROF 或 PHD 格式格式化的堆转储。
其他资源
有关使用 Eclipse MAT 的详情,请参考 Eclipse MAT 文档。
3.2.2.2. 堆转储分析提示
有时,堆性能问题的原因很明显,但有些时候,您可能需要了解应用代码以及导致 OutOfMemoryError
等问题的具体情况。这有助于识别问题是否为内存泄漏,或者堆是否只是足够大。
识别内存用量问题的一些建议包括:
- 如果未找到单个对象来消耗太多内存,请尝试按类分组来查看很多小对象是否消耗大量内存。
-
检查内存的最大使用是否为线程。如果
OutOfMemoryError
-triggered heap dump 比指定的Xmx
最大堆大小小,则这的一个良好指示符是。 -
使内存泄漏更加可检测的技术是临时将正常的最大堆大小加倍。当发生
OutOfMemoryError
时,与内存泄漏相关的对象大小大约是堆大小的一半。
当确定了内存问题的来源时,您可以查看垃圾回收根中的路径,以查看对象处于活动状态。