Java/JVM 常见故障诊断文件速查表
Java 应用出现异常、OOM、频繁 GC 或 JVM 崩溃时,通常会接触到多种日志和 Dump 文件。不同文件记录的是不同层面的现场信息,不能混用。
下面对常见的应用日志、GC 日志、Fatal Error Log、Heap Dump、Crash Dump 和 JFR 进行统一对比。
| 特性 | 应用日志 | GC日志 | hs_err_pid | Heap Dump(.hprof) | Crash Dump(.mdmp/core) | JFR(.jfr) |
|---|---|---|---|---|---|---|
| 主要来源 | Logback、Log4j2 等 | JVM GC 日志 | HotSpot Fatal Error | JVM Heap Dump | 操作系统 / 调试器 | Java Flight Recorder |
| 生成时机 | 应用运行期间 | JVM 运行、GC 发生时 | JVM 发生致命错误时 | 手动导出或配置 OOM 自动生成 | 进程 / JVM native crash 时 | 运行过程中持续或按需录制 |
| 常见生成方式 | 日志框架配置 | -Xlog:gc* |
JVM 自动生成 | jcmd GC.heap_dump、jmap、-XX:+HeapDumpOnOutOfMemoryError |
WinDbg、系统 Core Dump 等 | jcmd JFR.start/dump、-XX:StartFlightRecording |
| 主要内容 | 业务上下文、异常信息 | GC 事件、堆变化、暂停时间 | 崩溃线程、Native 栈、JVM / 系统状态 | Java 堆对象及引用关系 | 进程内存、线程、Native 状态 | CPU、GC、线程、锁、对象分配、I/O 等事件 |
| 文件大小 | KB~GB,视日志量而定 | 通常较小 | 通常较小 | 通常很大 | 通常很大 | 可控 |
| 常用分析工具 | 文本编辑器、日志平台 | 文本、GC 分析工具 | 文本编辑器 | Eclipse MAT、VisualVM | WinDbg、gdb / lldb 等 | JDK Mission Control、jfr |
| 最擅长 | 业务异常定位 | GC 性能与内存趋势分析 | JVM / Native 崩溃初步定位 | OOM、内存泄漏、大对象、引用链分析 | Native Crash 深度分析 | 性能、CPU、GC、锁、I/O、线程综合分析 |
| 是否适合定位对象泄漏 | 间接 | 只能看趋势 | 通常不适合 | 非常适合 | 不以此为主 | 可观察分配和增长趋势 |
| 典型问题 | "业务为什么报错?" | "为什么 GC 这么频繁?" | "JVM 为什么崩了?" | "谁把堆内存占满了?" | "Native 层为什么崩了?" | "系统为什么慢、卡、CPU 高?" |
可以简单记忆:
text
业务问题
↓
应用日志
GC问题
↓
gc.log
JVM致命崩溃
↓
hs_err_pid
Java堆问题
↓
.hprof
Native崩溃
↓
.mdmp / core
综合性能现场
↓
JFR
核心区别可以概括为:
日志看"发生过什么",Heap Dump 看"堆里有什么、谁引用谁",Crash Dump 看"进程 / Native 层崩溃现场",JFR 更适合还原一段时间内 JVM 的综合运行状态。