3.2. Java Heap Dumps
Java 堆转储是某一时间点上创建的 JVM 堆的快照。创建和分析堆转储对于诊断和故障排除 Java 应用的问题非常有用。
根据您使用的 JDK,可以通过不同的方法来为 JBoss EAP 进程创建和分析 Java 堆转储。本节介绍 Oracle JDK、OpenJDK 和 IBM JDK 的常用方法。
3.2.1. 创建 Heap Dump 复制链接链接已复制到粘贴板!
3.2.1.1. OpenJDK and Oracle JDK 复制链接链接已复制到粘贴板!
创建 On-Demand Heap Dump
您可以使用 jcmd
命令为在 OpenJDK 或 Oracle JDK 上运行的 JBoss EAP 创建按需堆转储。
- 确定您要从中创建堆转储的 JVM 进程 ID。
使用以下命令创建堆转储:
jcmd JAVA_PID GC.heap_dump -all=true FILENAME.hprof
$ jcmd JAVA_PID GC.heap_dump -all=true FILENAME.hprof
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这会以 HPROF 格式创建一个堆转储文件,通常位于
EAP_HOME 或
EAP_HOME/bin
中。或者,您可以指定另一个目录的文件路径。
在 OutOfMemoryError 上创建一个 Heap Dump Automatically
您可以使用 -XX:+HeapDumpOnOutOfMemoryError
JVM 选项在抛 出 OutOfMemoryError
异常时自动创建堆转储。
这会以 HPROF 格式创建一个堆转储文件,通常位于 EAP_HOME 或
EAP_HOME/bin
中。或者,您可以使用 -XX:HeapDumpPath=/path/
为堆转储设置自定义路径。如果您使用 -XX:HeapDumpPath
指定文件名,例如 -XX:HeapDumpPath=/path/filename.hprof
,堆转储会相互覆盖。
有关如何将 JVM 选项 应用到 受管域中的单机服务器或服务器 的说明,请参阅 JBoss EAP 配置指南。
3.2.1.2. IBM JDK 复制链接链接已复制到粘贴板!
使用 IBM JDK 时,当抛 出 OutOfMemoryError
时会自动生成堆转储。
IBM JDK 的堆转储保存至 /tmp/
目录中,作为可移植堆转储(PHD)格式文件保存在 /tmp/ 目录中。
3.2.2. 分析 Heap Dump 复制链接链接已复制到粘贴板!
堆转储分析工具
有许多工具可以分析堆转储文件并帮助识别问题。红帽支持建议使用 Eclipse Memory Analyzer 工具(MAT),该工具 可分析 HPROF 或 PHD 格式的堆转储。
有关使用 Eclipse MAT 的详情请参考 Eclipse MAT 文档。
Hap Dump Analysis Tips
有时,堆性能问题的原因显而易见,但有时您可能需要了解应用的代码和导致 OutOfMemoryError
等问题的具体情况。这有助于识别问题是否为内存泄漏,或者堆是否足够大。
些识别内存用量问题的建议包括:
- 如果发现单个对象消耗过多内存,请尝试类分组,以查看许多小对象消耗了大量内存。
-
检查内存的最大使用量是否为线程。这是一个很好的指示点,即
OutOfMemoryError
-triggered 堆转储比指定的Xmx
最大堆大小小得多。 -
使内存泄漏更易于检测的一种技巧是暂时使通常的最大堆大小加倍。发生
OutOfMemoryError
时,与内存泄漏相关的对象大小大约是堆大小的一半。
识别内存问题的来源后,您可以查看垃圾回收 root 的路径,以查看对象的活跃状态。