Java/JVM 常见诊断文件对比

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 的综合运行状态。

相关推荐
小羊没烦恼!5 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
俊昭喜喜里5 天前
java中的继承和多态的区别
java
小羊没烦恼!5 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕5 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码5 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖5 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时5 天前
01-06-A-JVM排查实战详解
java·jvm
伞伞悦读5 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
vipxieliang5 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
C语言小火车5 天前
C/C++ 为什么需要编译器?
开发语言·c++