JDK 工具
Java 提供了一系列强大的命令行工具,用于监控和管理正在运行的 Java 进程。这些工具是 JDK 自带的,无需额外安装,是开发者排查 JVM 问题、分析内存使用、查看进程状态的重要利器。
本文将带你一步步使用 jps、jstat、jinfo、jmap、jstack 等工具,从基础进程查看到内存分析、线程堆栈追踪,全面掌握 Java 进程监控技巧。
一、确认 Java 环境与进程
在开始之前,请确保你的系统已安装 JDK,并且有正在运行的 Java 进程。可以使用以下命令查看当前所有 Java 进程:
jps -l
输出示例:
12345 com.example.MainApp
67890 sun.tools.jps.Jps
这会列出所有 Java 进程及其主类的全限定名,方便你选择要监控的目标进程。
二、常用 JVM 监控工具详解
1. jps:列出 Java 进程
jps
是最基础的进程查看工具,用于列出当前用户下的所有 Java 进程。
jps -l
参数说明:
-l
:输出主类的全限定名或 JAR 文件路径。
2. jstat:监控 JVM 运行时状态
jstat
用于实时监控 JVM 的堆内存、GC 情况、类加载等指标,是排查性能问题的利器。
jstat -gcutil <pid> 1000 5
参数说明:
-gcutil
:显示堆中各区域的使用百分比;
1000
:每 1000 毫秒刷新一次;
5
:共输出 5 次。
3. jinfo:查看和修改 JVM 参数
jinfo
用于查看或动态修改 JVM 启动参数,适合排查启动配置问题。
jinfo -flags <pid>
输出示例:
Attaching to process ID 12345, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 17.0.5+8-LTS
Non-default VM flags: -XX:+UseG1GC -XX:MaxGCPauseMillis=200
4. jmap:生成堆转储(Heap Dump)
jmap
可用于生成堆内存快照,适合排查内存泄漏或对象占用问题。
jmap -dump:format=b,file=heapdump.hprof <pid>
参数说明:
-dump:format=b
:生成二进制格式的堆转储文件;
file=heapdump.hprof
:指定输出文件名。
5. jstack:查看线程堆栈(新增)
jstack
用于生成 Java 进程中所有线程的堆栈跟踪,帮助排查线程死锁、阻塞、CPU 高占用等问题。
jstack -l <pid>
参数说明:
-l
:输出额外的锁信息(如锁定的对象);
-F
:强制输出堆栈(即使进程卡住);
-m
:混合模式(同时输出 Java 栈和本地栈,适用于 JNI 调用)。
输出示例:
"main" #1 prio=5 os_prio=0 tid=0x00007f8c1c009800 nid=0x1234 runnable [0x00007f8c1d4f6000]java.lang.Thread.State: RUNNABLEat com.example.MainApp.main(MainApp.java:10)Locked ownable synchronizers:- None
三、进阶工具:可视化与深度分析
1. jcmd:全能型 JVM 控制工具
jcmd
是一个多功能工具,可以执行 JVM 内部命令,如 GC、生成堆转储、查看类加载等。
jcmd <pid> GC.class_histogram
常用命令:
命令 | 功能 |
---|---|
GC.class_histogram | 查看堆中所有类的统计信息 |
GC.heap_dump | 生成堆转储文件 |
Thread.print | 打印线程堆栈(类似 jstack) |
VM.flags | 显示 JVM 启动参数 |
2. jhat:堆转储分析工具
jhat
用于分析 jmap
生成的堆转储文件,并提供 Web 界面查看对象引用关系。
jhat heapdump.hprof
启动后访问 http://localhost:7000
即可查看堆中对象的信息。
3. jvisualvm:可视化监控工具
jvisualvm
是 JDK 自带的图形化工具,支持实时监控、线程分析、堆转储分析等功能。
启动命令:
jvisualvm
jvisualvm
可以实时查看 CPU、内存、线程状态;支持 Heap Dump 分析;可安装插件扩展功能(如 Visual GC)。
4. jmc:Java Mission Control(专业监控工具)
jmc
是 Oracle 推出的专业 JVM 监控工具,支持飞行记录(Flight Recorder),适合长期监控和事后分析。
启动命令:
jmc
5. javap:反编译工具(辅助分析)
javap
用于反编译 .class
文件,查看类的结构(方法、字段、常量池等),辅助理解类的内部实现。
javap -c MyClass.class
参数说明:
-c
:显示字节码;
-v
:显示详细信息(包括常量池)。
四、实战场景:如何选择工具?
场景 | 推荐工具 |
---|---|
快速查看 Java 进程 | jps |
实时监控堆内存和 GC | jstat |
查看或修改 JVM 参数 | jinfo |
生成堆转储文件 | jmap |
分析线程堆栈或死锁 | jstack |
执行 JVM 内部命令 | jcmd |
可视化监控与分析 | jvisualvm 、jmc |
反编译类文件 | javap |
五、总结
JVM 提供的工具链非常强大,从基础的进程查看到深度的内存、线程分析,应有尽有。熟练掌握这些工具,可以大幅提升你在排查 JVM 问题、优化性能时的效率。
如果你有更复杂的监控需求(如分布式系统监控、自动化告警),可以结合这些工具与日志系统(如 ELK、Prometheus)一起使用,效果更佳。