jps、jstack、jmap、jstat、jinfo是JDK内置五大核心诊断工具:jps查进程PID,jstack分析线程死锁与阻塞,jmap抓堆快照与对象统计,jstat监控GC行为,jinfo读取JVM启动参数与系统属性。

快速定位Java进程、分析线程死锁、抓取堆内存快照、监控GC行为——这些运维和调优场景每天都在真实发生,你不能靠猜,得用JDK自带的命令行工具直接查。
查Java进程:jps 快速定位PID
第一步:在终端执行 jps,它会列出当前所有Java进程的PID和主类简名(如 8923 SpringBootApp)。
第二步:若需完整类路径,加 -l 参数:jps -l → 输出类似 8923 com.example.Application,避免因类名重复导致误杀进程。
第三步:只想要PID?用 -q:jps -q → 输出纯数字列表,适合管道给 kill 或脚本读取。
注意:【jps 不显示非Java进程,也不显示已退出但残留的pid文件】;如果进程明明在跑却查不到,检查是否用了 -Djava.class.path 启动或被容器隔离。
看线程状态:jstack 抓快照分析阻塞
方法一:导出完整线程堆栈到文件
执行 jstack -l 8923 > thread_dump.log,其中 8923 是目标PID。这个文件里包含每个线程的锁持有关系、等待状态、堆栈帧。
方法二:直接在终端查看关键线索
运行 jstack -l 8923 | grep -A 10 "java.lang.Thread.State",快速筛出处于 BLOCKED 或 WAITING 的线程。
方法三:检测死锁(一步到位)jstack -l 8923 | grep -A 20 "deadlock" → 若有输出,说明存在死锁,后面会跟具体线程ID和锁对象地址。
这一步操作起来很简单,直接把文件拖进去就行。但【必须确保目标进程仍在运行,jstack对已崩溃或僵死进程可能无响应】。
查内存分布:jmap 看堆结构与对象统计
jmap -heap 8923 → 显示新生代、老年代、Metaspace等各区域容量、已用空间、GC算法类型,确认是否启用了G1或ZGC。
jmap -histo:live 8923 → 列出当前存活对象的类名、实例数、总占用字节,按内存从高到低排序,一眼揪出疑似泄漏的类(比如 byte[] 或 HashMap$Node 异常多)。
jmap -dump:format=b,file=heap.hprof 8923 → 触发一次完整的堆转储,生成二进制文件供 VisualVM 或 Eclipse MAT 分析。该操作会短暂暂停应用(STW),【务必避开业务高峰执行】。
监控GC行为:jstat 实时跟踪垃圾回收
执行 jstat -gc 8923 1000 5 → 每隔1秒输出一次GC统计,共5次。重点关注 YGC(年轻代GC次数)、YGCT(年轻代GC耗时)、FGC(Full GC次数)是否陡增。
如果发现 FGC 频繁且 OU(老年代使用率)持续高于90%,说明对象过早晋升或内存泄漏,需结合 jmap -histo 进一步排查。
别用 jstat -gc 8923 不带时间参数——它只打一行就退出,根本看不出趋势。
查JVM启动参数:jinfo 动态读取配置
jinfo -flags 8923 → 查看JVM实际生效的全部参数,包括 -Xmx、-XX:+UseG1GC 等,验证配置是否被覆盖或遗漏。
jinfo -sysprops 8923 → 输出系统属性,比如 user.dir、java.version、自定义的 -Denv=prod,排查环境变量误配问题。
注意:【jinfo 无法修改正在运行的JVM参数(除少数可动态开关的flag外),仅作只读诊断】。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











