Skip to content
JVM 与进程排障 · 第 3 篇 / 共 3 篇
领域编程与框架
专题Java 专题
当前序列JVM 与进程排障
阅读位置第 3 篇 / 共 3 篇当前专题第 5 个序列 / 共 10 个序列

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 自身先因为内存不足而崩掉

六、脚本化处理的思路

原始笔记里已经有一段自动化脚本思路,这个方向是对的:

  1. 找到目标 Java 进程 PID
  2. 生成带时间戳的 Dump 文件
  3. 调用分析脚本输出报告

这种方式特别适合:

  • 线上偶发问题
  • 需要重复抓取现场
  • 想把排障流程标准化

七、一个更实用的提醒

如果问题真的是“CPU 飙升”,那仅仅生成 Heap Dump 往往不够。

因为:

  • Heap Dump 更偏内存问题排查
  • CPU 高更常需要结合线程栈来分析

例如:

  • top -Hp <pid>
  • jstack <pid>

所以可以简单记成:

  • 内存问题多看 jmap / Heap Dump / MAT
  • CPU 问题多看线程和栈信息

一句话总结

排查 Java 进程问题时,不要一上来就乱抓文件。先判断是 CPU、内存还是线程问题,再决定是优先用 jpsjmapjstack,还是直接生成 Heap Dump 交给 MAT 分析。

延伸阅读相关文章优先当前专题,再补跨专题关联。
同一序列 · 回看前文会更完整GC 日志怎么看适合把 GC、内存分析和 Java 进程排查放在同一条诊断主线上看。Java 专题 · JVM 与进程排障同一序列 · 回看前文会更完整JVM 内存问题怎么分析适合把 GC、内存分析和 Java 进程排查放在同一条诊断主线上看。Java 专题 · JVM 与进程排障同专题其他序列 · 共享标签:线上排障、案例排障Metaspace 飙升通常说明了什么适合把 GC 触发、元空间、Safepoint 和 JIT 优化放到同一条运行时分析主线上看。Java 专题 · JVM 调优与运行时诊断同专题其他序列 · 共享标签:线上排障、案例排障Young GC 和 Full GC 的触发条件怎么区分适合把 GC 触发、元空间、Safepoint 和 JIT 优化放到同一条运行时分析主线上看。Java 专题 · JVM 调优与运行时诊断跨专题关联 · 共享标签:线上排障、案例排障磁盘打满后为什么删除文件不一定立刻生效适合把 Redis 抖动、MySQL 连接打满、MQ 积压、ES 发黄、ClickHouse 合并堆积和磁盘打满放在同一条基础设施排障主线上看。数据与基础设施排障专题 · 数据与基础设施故障的分层排查跨专题关联 · 共享标签:线上排障、案例排障大 Header、buffer、timeout 问题怎么排查适合把 location 匹配、缓冲区和负载均衡放在一起看。容器与站点部署专题 · Nginx 进阶路由与代理治理
继续阅读JVM 与进程排障当前序列第 3 篇 / 共 3 篇当前专题第 5 个序列 / 共 10 个序列
往前看
上一篇GC 日志怎么看回到当前序列上一章上一序列Java 线程池与异步编排从第 1 篇开始:线程池参数怎么配
往后看
下一序列Java 锁实现与并发细节从第 1 篇开始:synchronized 为什么仍然是 Java 并发里的默认首选

把零散经验整理成可查、可复用、可持续更新的企业级知识门户