【随手记录】java故障诊断和性能分析中 几个文件javacore heapdump dmp hprof说明
在 Java 故障诊断和性能分析中,经常会遇到 javacore
、heapdump
、.dmp
和 .hprof
这几类文件。它们各自有不同的目的、内容和生成方式:
-
javacore
(也称为 Thread Dump)-
目的: 捕获 JVM 中所有线程在某一时刻的执行状态(堆栈跟踪)。主要用于分析线程死锁、高 CPU 占用、线程阻塞、程序无响应(挂起)等问题。
-
内容:
-
所有活动线程的完整堆栈跟踪信息(正在执行的方法)。
-
线程状态(如 RUNNABLE, BLOCKED, WAITING, TIMED_WAITING)。
-
线程持有的锁信息(如果适用)。
-
线程所属的线程组。
-
通常还包含一些 JVM 基本信息(如命令行参数、环境变量、类路径、操作系统信息、CPU 信息、内存使用概览等)。
-
-
大小: 通常相对较小(KB 到 MB 级别)。
-
生成方式:
-
Unix/Linux:
kill -3 <pid>
(发送 SIGQUIT 信号给 JVM 进程)。 -
Windows: 在运行 JVM 的控制台窗口按
Ctrl + Break
。 -
JDK 工具:
jstack <pid>
。 -
JVM 监控/管理工具 (如 VisualVM, JConsole)。
-
应用服务器管理控制台。
-
-
文件扩展名: 通常为
.txt
,.javacore
,.tdump
等(没有绝对标准,IBM JDK 明确使用.javacore
)。 -
分析工具: 文本编辑器、
jstack
、VisualVM、IBM Thread and Monitor Dump Analyzer (TMDA)、在线分析工具等。
-
-
heapdump
(堆转储)-
目的: 捕获 JVM 堆内存在某一时刻的完整快照。用于分析内存泄漏、查找内存消耗最大的对象、理解对象引用关系、分析对象分布等内存相关问题。
-
内容:
-
堆中所有存活对象的详细信息(类名、字段值、地址)。
-
对象之间的引用关系图。
-
对象的 GC Root(根引用)信息。
-
不包含栈信息(线程执行状态)。
-
-
大小: 非常大,通常接近或等于 JVM 堆的已使用内存大小(几百 MB 到几十 GB 都有可能)。
-
生成方式:
-
JDK 工具:
jmap -dump:format=b,file=<filename.hprof> <pid>
。 -
JVM 参数:
-XX:+HeapDumpOnOutOfMemoryError
(在 OOM 时自动生成),-XX:HeapDumpPath=<path>
。 -
JVM 监控/管理工具 (如 VisualVM, JConsole, JMC)。
-
JMX: 调用
HotSpotDiagnosticMXBean.dumpHeap()
。
-
-
文件扩展名/格式: 最常见的格式是
.hprof
(由 Sun/Oracle JDK 工具生成的标准格式)。IBM JDK 有自己的专有堆转储格式 (通常扩展名为.phd
或.dmp
)。有时人们会笼统地将堆转储文件称为heapdump
或dump
。 -
分析工具: Eclipse Memory Analyzer Tool (MAT)、VisualVM、YourKit、JProfiler、IBM HeapAnalyzer (用于分析 IBM PHD 格式)、
jhat
(已过时)。 - MAT也可以分析 IBM PHD 格式,需要 打开help -> install new software 选择add
https://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/runtimes/tools/dtfj/
-
-
.dmp
(核心转储文件 - Core Dump)-
目的: 捕获 整个进程(包括 JVM 本身、Java 堆、栈、本地库、操作系统资源等)在崩溃或收到特定信号时的完整内存镜像。用于分析 JVM 崩溃(JVM 本身故障,如 Segmentation Fault)、本地代码(JNI)崩溃、或严重的系统级错误。
-
内容: 整个进程地址空间的原始内存拷贝,包含 JVM 内部数据结构、Java 堆、栈、加载的本地库、寄存器状态等。远不止是 Java 堆信息。
-
大小: 极其巨大,通常等于进程占用的虚拟内存大小(远大于 Java 堆大小,可能达到几十 GB)。
-
生成方式:
-
操作系统在进程崩溃(如访问非法地址)时自动生成(通常需要配置
ulimit -c unlimited
在 Linux)。 -
通过工具手动触发 (如
gcore <pid>
在 Linux)。 -
Windows: 通过 Dr. Watson 或 WinDbg 配置生成。
-
-
文件扩展名: Linux/Unix 通常为
core
或core.<pid>
,Windows 通常为.dmp
。 -
分析工具: 需要操作系统级别的调试器:
-
Linux/Unix:
gdb
(GNU Debugger) + JVM 的jhsdb
工具 (jhsdb jmap --binaryheap --dumpfile <corefile>
可以从核心转储中提取出标准的.hprof
堆转储文件进行分析)。 -
Windows:
WinDbg
+SOS
/SOSEX
扩展或 JVM 的调试工具。 -
注意: 分析核心转储通常比分析
.hprof
堆转储更复杂、更底层。
-
-
-
.hprof
(Heap Profiler 格式的堆转储文件)-
目的:
heapdump
的一种具体实现格式。它是 Sun Microsystems (后被 Oracle 继承) 的 HPROF 工具定义的一种二进制格式,用于存储堆转储数据。这是 Oracle/Sun JDK 工具(jmap
)生成的堆转储的标准格式。 -
内容: 同
heapdump
- 堆中所有存活对象的详细信息及其引用关系。 -
大小: 同
heapdump
- 很大。 -
生成方式: 同
heapdump
,主要在使用 Oracle/Sun JDK 工具(如jmap
)或配置-XX:+HeapDumpOnOutOfMemoryError
时生成。OpenJDK 也使用此格式。 -
文件扩展名:
.hprof
-
分析工具: 同
heapdump
- Eclipse MAT、VisualVM、YourKit、JProfiler 等。这是最常用、工具支持最广泛的堆转储格式。 IBM JDK 的工具(如 IBM Memory Analyzer)也能导入和分析.hprof
文件。
-
总结与区别:
特性 | javacore (Thread Dump) | heapdump | .dmp (Core Dump) | .hprof (Heapdump Format) |
---|---|---|---|---|
主要目的 | 分析线程状态 (死锁、高CPU、卡死) | 分析堆内存 (泄漏、对象分布) | 分析进程崩溃 (JVM/本地代码崩溃) | heapdump 的标准格式 |
核心内容 | 线程栈跟踪、状态、锁信息 | 堆中所有对象及引用关系 | 整个进程内存镜像 (包括堆、栈、本地代码、OS状态) | 堆中所有对象及引用关系 (二进制格式) |
大小 | 小 (KB - MB) | 很大 (≈ 堆使用量) | 巨大 (≈ 进程虚拟内存) | 很大 (≈ 堆使用量) |
JVM 特定 | 是 (内容格式) | 是 (概念) | 否 (操作系统级) | 是 (Sun/Oracle 标准格式) |
典型扩展名 | .txt , .javacore , .tdump |
.hprof , .phd (IBM), .dmp (有时) |
.dmp (Win), core (Unix) |
.hprof |
生成触发 | kill -3 , jstack , Ctrl+Break |
jmap , OOM 参数, 工具 |
进程崩溃, gcore |
jmap , OOM 参数 (Sun/Oracle) |
关键分析工具 | jstack, VisualVM, TMDA | MAT, VisualVM, JProfiler | gdb/jhsdb, WinDbg/SOS | MAT, VisualVM, JProfiler |
核心区别点 | 线程执行快照 | 堆内存快照 | 整个进程崩溃快照 | 堆内存快照的标准格式 |
简单记忆:
-
程序卡住了? ➔ 抓
javacore
(Thread Dump) 看线程在干嘛。 -
内存泄漏了?内存快满了? ➔ 抓
heapdump
(通常是.hprof
文件) 看谁占着内存不放。 -
JVM 自己崩溃了 (Segmentation Fault 等)? ➔ 需要分析
.dmp
(Core Dump) 文件找底层原因。 -
.hprof
是heapdump
最常见、最通用的格式 (由 Sun/Oracle JDK 定义)。
注意:
-
IBM JDK 有其特有的
javacore
格式和堆转储格式 (.phd
),但通常也能处理标准的.hprof
文件。当看到.dmp
文件时,需要根据上下文判断:如果是 IBM JDK 的堆转储,分析方式类似.hprof
;如果是操作系统生成的核心转储,则需要用gdb/jhsdb
或 WinDbg 分析。 -
在生产环境获取
heapdump
(.hprof
) 和.dmp
(Core Dump) 要特别小心,因为它们非常大,可能影响系统性能或占满磁盘空间。获取javacore
通常影响较小。 - IBM相关工具下载:https://public.dhe.ibm.com/software/websphere/appserv/support/tools/
- MAT下载:https://eclipse.dev/mat/ 可以选择国内的节点下载