JDK 自带四大命令行工具:jstat、jstack、jmap、jhat 详解

JDK 自带四大命令行工具:jstat、jstack、jmap、jhat 详解

这四个是 JDK 自带的线上问题排查核心工具 ,专门用于定位 Java 应用的性能瓶颈、内存泄漏、死锁、CPU 飙高等问题,无需额外安装,只要装了 JDK 就能用。

我会用最实用、最常用 的命令,直接告诉你:什么时候用、怎么用、看什么


一、先准备:获取 Java 进程 ID

所有工具第一步都需要进程 ID(PID),先执行:

bash 复制代码
jps -l

输出示例:

复制代码
12345 com.example.Application
67890 sun.tools.jps.Jps

12345 就是你的 Java 应用 PID。


1. jstat:JVM 统计信息监控工具(看性能、GC)

作用 :查看类加载、内存使用、GC 频率/耗时,排查 GC 频繁、内存占用高问题。

最常用命令

1)查看 GC 概况(最常用)
bash 复制代码
jstat -gc 12345 1000 10
  • 1000:每隔 1000ms(1秒)输出一次
  • 10:总共输出 10 次

关键字段

  • S0C/S1C:Survivor 区大小
  • E:Eden 区使用比例
  • O:老年代使用比例
  • YGC/YGT:Young GC 次数/耗时
  • FGC/FGT:Full GC 次数/耗时
  • GCT:GC 总耗时

排查技巧

  • FGC 快速上涨 ➜ 老年代内存泄漏
  • YGC 每秒多次 ➜ 短生命周期对象过多
2)查看堆内存使用百分比
bash 复制代码
jstat -gcutil 12345

2. jstack:堆栈跟踪工具(看线程、死锁、CPU 飙高)

作用 :导出线程堆栈 ,排查死锁、线程阻塞、CPU 100%、程序假死

最常用命令

1)导出所有线程堆栈(保存到文件分析)
bash 复制代码
jstack 12345 > thread.log
2)直接排查死锁(自动检测)
bash 复制代码
jstack -l 12345

文件末尾会显示:Found one Java-level deadlock

排查 CPU 飙高高阶用法

  1. 找到 CPU 最高的线程 ID

    bash 复制代码
    top -H -p 12345
  2. 将线程 ID 转成 16 进制

    bash 复制代码
    printf "%x\n" 12345
  3. 在 jstack 日志中搜索该 16 进制 ID,定位耗时代码


3. jmap:内存映像工具(导出堆、看对象)

作用 :导出堆内存快照(dump 文件),查看堆内对象数量、大小,定位内存泄漏。

最常用命令

1)导出堆快照(排查内存泄漏必备)
bash 复制代码
jmap -dump:format=b,file=heap.hprof 12345
  • heap.hprof:二进制堆文件,可导入工具分析
  • 注意 :导出时会暂停 JVM,生产环境谨慎使用
2)查看堆中对象统计(数量+大小)
bash 复制代码
jmap -histo 12345 | head -20

输出:序号、实例数、字节数、类名

能直接看到哪个类的对象最多,快速定位泄漏点。

3)查看 JVM 堆配置
bash 复制代码
jmap -heap 12345

查看新生代、老年代大小、垃圾回收器等信息。


4. jhat:堆快照分析工具(分析 hprof 文件)

作用 :解析 jmap 导出的 hprof 堆快照,提供 Web 界面查看内存对象

注意:jhat 功能简单,大型堆文件建议用 MAT(Eclipse Memory Analyzer),jhat 适合快速简单分析。

使用命令

bash 复制代码
jhat -port 9999 heap.hprof
  • 启动后访问:http://localhost:9999
  • 页面可查看:所有对象、引用关系、泄漏疑点

二、快速使用场景总结(直接背这个)

工具 核心用途 最常用命令
jstat 看 GC、内存使用率、性能监控 jstat -gc PID 1000 10
jstack 看线程、死锁、CPU 飙高 jstack -l PID > thread.log
jmap 导出堆快照、看对象数量 jmap -dump:file=heap.hprof PID
jhat 分析堆快照(Web 界面) jhat -port 9999 heap.hprof

三、标准问题排查流程(实战)

  1. CPU 飙高topjstack → 定位耗时代码
  2. 内存飙升/泄漏jstat -gc 看 FGC → jmap 导出 dump → jhat/MAT 分析
  3. 程序卡死jstack 查死锁、阻塞线程
  4. GC 频繁jstat -gcutil 定位 GC 问题

总结

  1. jstat:监控 GC 和内存使用,不暂停应用
  2. jstack:抓线程堆栈,查死锁、CPU 高
  3. jmap:导出堆快照,查对象泄漏
  4. jhat:简单分析堆快照(推荐用 MAT 替代)

这四个工具是 Java 线上问题排查的基础必备技能,记住常用命令就能解决 80% 的 JVM 问题。

相关推荐
ch.ju1 小时前
Java程序设计(第3版)第四章——set方法为属性赋值
java·开发语言
创业之路&下一个五年1 小时前
JS编程范式 \& 面向对象范式
开发语言·前端·javascript
代码中介商1 小时前
C++11移动语义:右值引用与高效资源转移
开发语言·c++
Hello:CodeWorld2 小时前
深入浅出 C++:静态多态与动态多态的业务应用场景与源码级实战
开发语言·c++·架构
星恒随风2 小时前
C++入门(一):第一个 C++ 程序、命名空间、输入输出和缺省参数
开发语言·c++·笔记·学习
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题 第94题】【Mysql篇】第24题:什么是单路排序?什么是双路排序??
java·开发语言·数据库·mysql·面试·排序算法
我是一颗柠檬2 小时前
【Java项目技术亮点】多级缓存一致性方案:Canal+MQ实现数据库与缓存的最终一致
java·数据库·spring·缓存·kafka·rocketmq
于先生吖2 小时前
Java分账体系设计,网约车行程计费与到店线下结账一体化后端开发实战
java·开发语言
Solis程序员2 小时前
拿捏登录安全:RS256 + 双令牌,把非法请求拦在 Redis 白名单门外
java·安全·缓存·面试·bootstrap·html