Appearance
Java 进程排查与 Heap Dump 使用记录:jps、jmap、MAT 怎么配合
原笔记标题写的是“CPU 飙升”,但内容本身更偏向 Java 进程排查和 Heap Dump 分析,所以这里重新整理成一个更准确的主题。
一、先明确排查目标
当 Java 服务出现异常时,至少要先判断是下面哪一类问题:
- CPU 飙高
- 内存持续上涨
- Full GC 频繁
- 线程阻塞或死锁
- 进程假死
不同问题,排查工具不完全一样。
这份笔记主要聚焦的是:
- 查看 Java 进程
- 生成 Heap Dump
- 用 MAT 做内存分析
二、先找到 Java 进程
查看当前 Java 进程
bash
jps -l -v这个命令的作用是:
- 查看 Java 进程 ID
- 看主类或 Jar 包名
- 看启动参数
在排查时,通常第一步就先确认:
- 哪个进程是目标服务
- 它的 JVM 参数是什么
三、查看堆相关信息
查看堆当前情况
bash
jmap -heap <pid>这个命令可以帮助你快速看当前堆分代和使用情况。
不过要注意:
- 某些环境下执行成本不低
- 在线上高负载服务上使用要谨慎
四、生成 Heap Dump
常见方式
bash
jmap -dump:format=b,file=heap.hprof <pid>如果进程状态异常,原始笔记里提到还可以尝试强制方式:
bash
jmap -F -dump:format=b,file=heap.hprof <pid>这类命令的作用是:
- 把当前 Java 进程堆内存快照导出成
.hprof - 供后续离线分析使用
五、MAT 分析时的一个关键点
原笔记里的这个提醒很有价值:
MAT 分析大文件时,给 MAT 分配的内存要尽量大一些
例如:
text
-Xmx10240m更准确地说,不一定非要“大于堆内存本身”,但如果 Heap Dump 很大,而 MAT 分配内存太小,分析过程会非常慢,甚至直接失败。
所以更稳妥的经验是:
- Dump 文件越大,MAT 需要的内存通常也要越大
- 至少不要让 MAT 自身先因为内存不足而崩掉
六、脚本化处理的思路
原始笔记里已经有一段自动化脚本思路,这个方向是对的:
- 找到目标 Java 进程 PID
- 生成带时间戳的 Dump 文件
- 调用分析脚本输出报告
这种方式特别适合:
- 线上偶发问题
- 需要重复抓取现场
- 想把排障流程标准化
七、一个更实用的提醒
如果问题真的是“CPU 飙升”,那仅仅生成 Heap Dump 往往不够。
因为:
- Heap Dump 更偏内存问题排查
- CPU 高更常需要结合线程栈来分析
例如:
top -Hp <pid>jstack <pid>
所以可以简单记成:
- 内存问题多看
jmap/ Heap Dump / MAT - CPU 问题多看线程和栈信息
一句话总结
排查 Java 进程问题时,不要一上来就乱抓文件。先判断是 CPU、内存还是线程问题,再决定是优先用 jps、jmap、jstack,还是直接生成 Heap Dump 交给 MAT 分析。