JDK自带的四大命令行工具(jstat/jstack/jmap/jhat)的使用详解

 更新时间:2026年06月05日 08:55:52   作者:码不停蹄的玄黓  
jstat、jstack、jmap、jhat这四个是 JDK 自带的线上问题排查核心工具,专门用于定位 Java 应用的性能瓶颈、内存泄漏、死锁、CPU 飙高等问题,无需额外安装,只要装了 JDK 就能用,感兴趣的小伙伴可以了解下

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

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

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

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

jps -l

输出示例:

12345 com.example.Application
67890 sun.tools.jps.Jps

12345 就是你的 Java 应用 PID。

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

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

最常用命令

1)查看 GC 概况(最常用)

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)查看堆内存使用百分比

jstat -gcutil 12345

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

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

最常用命令

1)导出所有线程堆栈(保存到文件分析)

jstack 12345 > thread.log

2)直接排查死锁(自动检测)

jstack -l 12345

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

排查 CPU 飙高高阶用法

找到 CPU 最高的线程 ID

top -H -p 12345

将线程 ID 转成 16 进制

printf "%x\n" 12345

在 jstack 日志中搜索该 16 进制 ID,定位耗时代码

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

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

最常用命令

1)导出堆快照(排查内存泄漏必备)

jmap -dump:format=b,file=heap.hprof 12345
  • heap.hprof:二进制堆文件,可导入工具分析
  • 注意:导出时会暂停 JVM,生产环境谨慎使用

2)查看堆中对象统计(数量+大小)

jmap -histo 12345 | head -20

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

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

3)查看 JVM 堆配置

jmap -heap 12345

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

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

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

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

使用命令

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 飙高:top → jstack → 定位耗时代码
  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 问题。

到此这篇关于JDK自带的四大命令行工具(jstat/jstack/jmap/jhat)的使用详解的文章就介绍到这了,更多相关JDK命令行工具使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java反射中java.beans包学习总结

    Java反射中java.beans包学习总结

    本篇文章通过学习Java反射中java.beans包,吧知识点做了总结,并把相关内容做了关联,对此有需要的朋友可以学习参考下。
    2018-02-02
  • SpringBoot结合prometheus自定义埋点方式

    SpringBoot结合prometheus自定义埋点方式

    文章介绍了如何使用Spring Actuator、Prometheus和Grafana进行度量统计收集、数据收集和数据展示,以监控生成环境机器的性能指标和业务数据指标
    2024-12-12
  • 详解Java中的泛型

    详解Java中的泛型

    这篇文章主要介绍了Java中的泛型,当我们不确定数据类型时,我们可以暂时使用一个字母 T代替数据类型,例如写一个方法,但是我们不知道它是传递的是什么数据类型,我们就可以使用泛型,到时候只要指明T是什么数据类型,就可以使用了,需要的朋友可以参考下
    2023-05-05
  • shiro整合springmvc配置静态资源过滤方式

    shiro整合springmvc配置静态资源过滤方式

    文章介绍了在Spring Boot + Spring MVC + Shiro + JSP项目中,如何正确配置静态资源路径以避免在引入Shiro过滤器后资源加载失败的问题
    2026-03-03
  • Java 8新增的方法参数反射实例分析

    Java 8新增的方法参数反射实例分析

    这篇文章主要介绍了Java 8新增的方法参数反射,结合实例形式分析了java8新增api方法参数反射相关操作技巧,需要的朋友可以参考下
    2019-07-07
  • Java获取Class对象的几种方式小结

    Java获取Class对象的几种方式小结

    本文给大家分享了Java获取Class对象的几种方式,使用类名.class 语法,使用对象的 getClass()方法,使用 Class.forName()方法等多种方法,不同的方式适用于不同的场景,需要的朋友可以参考下
    2023-10-10
  • synchronized背后的monitor锁实现详解

    synchronized背后的monitor锁实现详解

    这篇文章主要为大家介绍了synchronized背后的monitor锁实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • springmvc注解配置实现解析

    springmvc注解配置实现解析

    这篇文章主要介绍了springmvc注解配置实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Java中的CopyOnWriteArrayList容器解析

    Java中的CopyOnWriteArrayList容器解析

    这篇文章主要介绍了Java中的CopyOnWriteArrayList容器解析,CopyOnWriteArrayList容器允许并发读,读操作是无锁的,性能较高。至于写操作,比如向容器中添加一个元素,则首先将当前容器复制一份,然后在新副本上执行写操作,需要的朋友可以参考下
    2023-12-12
  • Java递归调用如何实现数字的逆序输出方式

    Java递归调用如何实现数字的逆序输出方式

    这篇文章主要介绍了Java递归调用如何实现数字的逆序输出方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04

最新评论