Dump 文件记录了某一时刻 JVM 的内存状态、线程堆栈、类信息等,是后续使用工具(如 MAT, JProfiler, VisualVM)进行分析的关键。
下面我将详细介绍几种主流的生成 Dump 文件的方法,包括手动触发和自动触发。
Dump 文件的类型
在开始之前,需要了解两种主要的 Dump 文件:
-
Heap Dump (堆转储文件)
- 包含了 JVM 中所有堆上对象的详细信息,如对象类型、大小、实例数量,以及对象之间的引用关系。
- 文件后缀:通常是
.hprof(Heap Profiler)。 - 用途:主要用于分析内存泄漏、查看内存占用情况。
- 生成方式:可以通过 JVM 参数、JMX 或工具命令生成。
-
Thread Dump (线程转储文件)
- 记录了某一时刻所有 Java 线程的堆栈信息,包括线程名、线程状态(如
RUNNABLE,BLOCKED,WAITING)、锁的持有情况等。 - 文件后缀:通常没有固定后缀,一般以
.txt- 用途:主要用于分析线程死锁、CPU 飙高、响应缓慢等问题。
- 生成方式:可以通过发送信号、JMX 或工具命令生成。
- 记录了某一时刻所有 Java 线程的堆栈信息,包括线程名、线程状态(如
重要提示:生成 Dump 文件是一个相对“重”的操作,它会暂停或轻微影响 JVM 的运行,并可能占用大量磁盘空间,建议在业务低峰期进行,并谨慎用于生产环境。
使用 JVM 参数(自动生成)
这是最常用和最推荐的方法,尤其是在生产环境中,通过配置 JVM 参数,可以在特定条件下(如内存溢出时)自动生成 Dump 文件。
自动生成 Heap Dump (OOM 时)
当发生 OutOfMemoryError 时,JVM 可以自动生成一份 Heap Dump,这对于事后分析内存泄漏的原因至关重要。
在启动 Java 应用时,添加以下 JVM 参数:
# -XX:+HeapDumpOnOutOfMemoryError: 表示在发生 OOM 时自动生成 Heap Dump # -XX:HeapDumpPath: 指定 Dump 文件的保存路径,如果路径包含目录,请确保该目录存在且有写权限。 # 可以使用%p来替换为进程ID,避免多实例时文件被覆盖。 java -Xmx256m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/java_pid%p.hprof -jar your_application.jar
参数说明:
-XX:+HeapDumpOnOutOfMemoryError:开启此功能。-XX:HeapDumpPath=<path>:设置文件路径。-XX:HeapDumpPath=/tmp/dump.hprof-XX:HeapDumpPath=/dumps/java_pid%p.hprof(推荐,%p会被替换为进程ID)
自动生成 Heap Dump (定时生成)
JDK 9+ 引入了新的 GC 参数,可以定时生成 Heap Dump,适用于需要周期性监控内存使用情况的场景。
# -XX:+StartFlightRecording: 启用 JFR (Flight Recorder) # jfr=settings=memory: 使用内存监控的 JFR 模板 # filename=/tmp/jfr.jfr: JFR 文件保存路径 # dumponexit=true: 在 JVM 退出时自动将 JFR 数据转换为 Heap Dump (.hprof) # dumponexitpath=/tmp/java_pid%p.hprof: 指定退出时生成的 Heap Dump 路径 java -XX:+StartFlightRecording:jfr=settings=memory,filename=/tmp/jfr.jfr,dumponexit=true,dumponexitpath=/tmp/java_pid%p.hprof -jar your_application.jar
注意:此方法在 JDK 8 中不可用,在 JDK 8 中,可以使用第三方工具或 JMX 来实现类似功能。
使用操作系统命令(手动触发)
当你在线上发现问题时,可以使用操作系统命令向 JVM 进程发送信号来手动触发 Dump。
使用 jcmd (推荐)
jcmd 是 JDK 自带的、功能强大的命令行工具,推荐使用它。
步骤:
-
找到 Java 进程的 PID (Process ID)。
# Linux/macOS jps -l # Windows jps -l
你会看到类似下面的输出,找到你的应用进程 ID。
12345 com.yourcompany.YourApplication -
使用
jcmd命令生成 Dump。# 语法: jcmd <PID> GC.heap_dump <filepath> # 示例: 生成 Heap Dump jcmd 12345 GC.heap_dump /tmp/manual_heapdump.hprof # 示例: 生成 Thread Dump jcmd 12345 Thread.print /tmp/threaddump.txt
jcmd 的优点是功能强大,除了生成 Dump,还可以执行很多其他诊断命令,如查看内存信息、加载类等。
使用 jstack 和 jmap (传统方法)
这是 JDK 5 就开始提供的传统工具,功能相对单一。
生成 Thread Dump:
# 语法: jstack <PID> > <filepath> jstack 12345 > /tmp/threaddump.txt
生成 Heap Dump:
# 语法: jmap -dump:format=b,file=<filepath> <PID> jmap -dump:format=b,file=/tmp/manual_heapdump.hprof 12345
注意:使用 jmap 生成 Heap Dump 时,JVM 会短暂暂停(Stop-the-World),对应用有轻微影响,在生产环境压力大时需谨慎。
使用 JMX (远程管理)
如果你的应用开启了 JMX 服务,就可以通过 JMX 客户端(如 VisualVM, JConsole)远程或本地触发 Dump 生成。
开启 JMX 服务
在启动应用时添加以下参数:
# -Dcom.sun.management.jmxremote: 开启 JMX # -Dcom.sun.management.jmxremote.port=<port>: 指定 JMX 监听端口 # -Dcom.sun.management.jmxremote.authenticate=false: 关闭认证 (仅用于测试,生产环境请务必开启) # -Dcom.sun.management.jmxremote.ssl=false: 关闭 SSL (仅用于测试) java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar your_application.jar
使用 VisualVM 触发
- 打开
VisualVM(在 JDK 的bin目录下)。 - 在左侧的 "本地" 或 "远程" 节点下找到你的应用。
- 右键点击应用,选择 "堆 Dump" (Heap Dump) 或 "线程 Dump" (Thread Dump)。
- VisualVM 会自动执行并显示分析结果,你也可以将 Dump 文件保存到本地。
使用 APM 工具(自动/手动)
专业的应用性能监控工具,如 SkyWalking, Pinpoint, Arthas 等,都内置了生成和分析 Dump 的能力。
-
Arthas: 阿里开源的 Java 诊断工具,非常强大,你可以使用其
dump命令。# 启动 Arthas java -jar arthas-boot.jar # 选择你的 Java 进程 # 使用 dump 命令生成 Heap Dump dump /tmp/arthas_heapdump.hprof # 使用 thread 命令生成 Thread Dump thread
-
SkyWalking/Pinpoint: 这些工具通常在后台提供一个 Web UI,你可以在 UI 上直接点击按钮为某个实例生成 Dump,然后下载进行分析。
总结与最佳实践
| 场景 | 推荐方法 | 优点 | 缺点 |
|---|---|---|---|
| 生产环境预防 | JVM 参数 -XX:+HeapDumpOnOutOfMemoryError |
自动、可靠、无需人工干预 | 只能在 OOM 时生成 |
| 生产环境手动诊断 | jcmd |
功能强大、JDK 自带、影响相对较小 | 需要登录服务器 |
| 开发/测试环境 | VisualVM / JConsole | 图形化界面、方便直观 | 需要开启 JMX,可能影响性能 |
| 深度诊断/热修复 | Arthas | 功能极其丰富、无需重启应用 | 需要学习工具命令 |
| 周期性监控 | JDK 9+ jcmd 定时任务 / JFR |
可定时、自动化 | JDK 9+ 专属,配置稍复杂 |
最佳实践建议:
- 生产环境必备:为所有线上服务设置
-XX:+HeapDumpOnOutOfMemoryError和-XX:HeapDumpPath,这是排查内存问题的最后一道防线。 - 准备工具:提前准备好分析 Dump 文件的工具,如 Eclipse MAT,并学习其基本使用方法。
- 明确目的:
- 怀疑内存泄漏,优先获取 Heap Dump。
- 怀疑死锁、CPU 高,优先获取 Thread Dump。
- 谨慎操作:手动生成 Dump(尤其是 Heap Dump)前,评估对业务的影响,尽量在低峰期操作,生成后尽快分析并清理文件,以免占用过多磁盘空间。
