JVM 监控工具全指南:从命令行到可视化工具
监控是 JVM 性能优化和问题排查的基础。JDK 自带了丰富的命令行工具,同时还有多种可视化工具,覆盖从进程监控、GC 分析、内存快照到线程跟踪的全场景。本文将系统梳理这些工具的功能、用法及适用场景,帮助开发者快速定位和解决 JVM 相关问题。
JDK 自带命令行工具
命令行工具轻量高效,适合在服务器环境中快速排查问题,核心工具包括 jps
、jstat
、jinfo
、jmap
、jstack
、jcmd
等。
jps
:查看 Java 进程信息
功能:列出当前运行的 Java 进程 ID 及主类信息,类似 ps
但仅针对 Java 程序。
用法:
1 | jps [-q] [-mlvV] [<hostid>] |
常用选项:
-q
:仅显示进程 ID(PID),不显示主类名;-l
:显示主类全限定名(如com.example.Application
)或 JAR 包路径;-m
:显示传递给main()
方法的参数;-v
:显示 JVM 启动参数(如-Xms2g -Xmx2g
)。
示例:
1 | jps -l # 显示进程 ID 和主类全路径 |
注意:若 Java 进程启动时添加了 -XX:-UsePerfData
,jps
将无法探测到该进程。
jstat
:JVM 统计信息监控
功能:实时监控虚拟机的类加载、内存、GC、JIT 编译等统计数据,是排查 GC 问题和内存泄漏的核心工具。
用法:
1 | jstat -<option> [-t] [-h<lines>] <pid> [<interval> [<count>]] |
核心参数:
<option>
:监控选项(如-gc
、-gcutil
);-t
:输出时间戳(进程启动后的秒数);-h<lines>
:每<lines>
行输出一次表头;<interval>
:采样间隔(单位 ms,默认 1000);<count>
:采样次数(默认无限)。
常用监控选项
选项 | 功能描述 | 核心输出指标(示例) |
---|---|---|
-class |
类加载统计 | Loaded (加载类数)、Unloaded (卸载类数)、Time (类加载耗时) |
-gc |
堆内存及 GC 统计 | S0U (S0 区使用量)、EU (Eden 区使用量)、OU (老年代使用量)、YGC (Young GC 次数)、FGC (Full GC 次数) |
-gcutil |
堆内存使用百分比 | S0 (S0 区使用率)、E (Eden 区使用率)、O (老年代使用率)、GCT (总 GC 耗时) |
-gccause |
同 -gcutil ,额外显示 GC 原因 |
LGCC (最近 GC 原因)、GCC (当前 GC 原因,如 Allocation Failure ) |
-gcnew |
新生代 GC 统计 | TT (对象存活次数阈值)、EC (Eden 区容量)、YGCT (Young GC 总耗时) |
-gcold |
老年代 GC 统计 | OC (老年代容量)、OU (老年代使用量)、FGCT (Full GC 总耗时) |
示例:
1 | 每 2000ms 监控一次 GC 百分比,共 5 次,带时间戳和表头(每 2 行) |
jinfo
:查看 / 修改 JVM 参数
功能:实时查看和动态修改虚拟机参数(仅支持标记为 manageable
的参数)。
用法:
1 | jinfo [option] <pid> |
常用选项:
-flags
:显示所有 JVM 参数;-flag <name>
:显示指定参数值(如-flag MaxHeapSize
);-flag [+|-]<name>
:开启 / 关闭参数(如-flag +PrintGC
);-flag <name>=<value>
:修改参数值(如-flag HeapDumpPath=/tmp/dump.hprof
);-sysprops
:显示系统属性(类似System.getProperties()
)。
示例:
1 | jinfo -flags 12345 # 查看进程 12345 的所有 JVM 参数 |
注意:仅 java -XX:+PrintFlagsFinal -version | grep manageable
列出的参数可动态修改。
jmap
:内存快照与对象统计
功能:生成堆内存快照(dump 文件)、统计存活对象分布,是分析内存泄漏和大对象的关键工具。
用法:
1 | jmap [option] <pid> |
核心选项:
-histo[:live]
:统计堆中对象数量和大小(live
仅统计存活对象);-heap
:输出堆内存详细信息(如分代大小、GC 收集器类型);-dump:<dump-options>
:生成堆快照(format=b
表示二进制格式);-F
:强制生成快照(当进程无响应时)。
示例:
1 | 统计存活对象(会触发 Full GC) |
自动生成快照:启动时添加 JVM 参数,OOM 时自动生成快照:
1 | java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/oom_dump.hprof -jar app.jar |
jstack
:线程堆栈分析
功能:生成线程堆栈快照,用于排查线程死锁、死循环、阻塞等问题。
用法:
1 | jstack [-l] [-F] <pid> |
常用选项:
-l
:显示额外的锁信息(如synchronized
持有的锁);-F
:强制生成快照(进程无响应时)。
线程状态解读:
RUNNABLE
:运行中;BLOCKED
:阻塞(等待锁);WAITING
:等待(如Object.wait()
);TIMED_WAITING
:超时等待(如Thread.sleep(1000)
);DEADLOCK
:死锁(需结合-l
查看)。
示例:
1 | jstack -l 12345 > stack.log # 导出线程堆栈到文件 |
jcmd
:多功能命令行工具
功能:集成了 jps
、jinfo
、jmap
、jstack
等工具的功能,支持更多高级操作(如手动触发 GC、查看系统属性)。
用法:
1 | jcmd <pid> <command> |
常用命令:
Thread.print
:打印线程堆栈(类似jstack
);GC.heap_dump
:生成堆快照(类似jmap -dump
);GC.run
:手动触发 GC;VM.flags
:查看 JVM 参数(类似jinfo -flags
);VM.system_properties
:查看系统属性(类似jinfo -sysprops
)。
示例:
1 | jcmd 12345 Thread.print # 打印线程堆栈 |
可视化监控工具
可视化工具更直观,适合实时监控和复杂分析,尤其适合开发和测试环境。
VisualVM(JDK 自带)
功能:集成了性能分析、内存监控、线程分析、堆快照分析等功能,支持插件扩展(如 GC 监控插件)。
核心功能:
概览:显示进程基本信息(PID、主类、JVM 参数);
监控:实时跟踪 CPU、堆内存、类加载、线程数量;
线程:查看线程状态及堆栈,检测死锁;
抽样器:CPU 和内存抽样,定位热点方法和大对象;
堆 Dump:生成并分析堆快照。
启动:JDK 目录下执行 jvisualvm
,支持本地和远程进程(需配置 JMX 参数)。
远程连接配置:
启动 Java 进程时添加参数:
1 | java -Djava.rmi.server.hostname=<远程IP> \ |
JConsole(JDK 自带)
功能:轻量级可视化工具,监控内存、线程、类加载、VM 信息等,适合快速查看基本状态。
核心功能:
概览:CPU、堆内存、线程、类加载的实时曲线;
内存:分代内存使用详情,支持手动触发 GC;
线程:线程状态列表,检测死锁;
VM 信息:JVM 参数、系统属性、操作系统信息。
启动:JDK 目录下执行 jconsole
,自动识别本地进程,支持远程 JMX 连接(同 VisualVM)。
Arthas(阿里开源)
功能:在线诊断工具,无需重启即可监控、跟踪代码执行,适合生产环境排查问题。
核心功能:
dashboard
:实时查看系统面板(CPU、内存、线程);trace
:跟踪方法调用耗时,定位性能瓶颈;watch
:观察方法入参、返回值和异常;heapdump
:生成堆快照;thread
:查看线程状态,检测死锁。
优势:中文文档、操作简单,支持动态修改日志级别、热更新代码。
使用:官网下载后执行 java -jar arthas-boot.jar
,选择进程即可进入交互界面。
MAT(Memory Analyzer Tool)
功能:专业堆快照分析工具,用于排查内存泄漏,支持大文件分析(GB 级)。
核心功能:
- Leak Suspects:自动检测内存泄漏点;
- Dominator Tree:展示对象支配关系,定位大对象;
- Histogram:对象数量和大小统计;
- Path to GC Roots:追踪对象到 GC Roots 的引用链。
使用:导入 jmap
生成的 dump 文件,通过 “Leak Suspects” 快速定位泄漏原因。
GC 分析工具
- GCViewer:离线分析 GC 日志,生成图表(GC 频率、耗时、内存变化);
- GCEasy(在线):上传 GC 日志,自动生成分析报告(推荐,支持多语言,地址:gceasy.io)。
其他工具
- JMC(Java Mission Control):集成 Java Flight Recorder,收集 JVM 性能数据,适合长期监控;
- JProfiler:商业工具,功能全面(内存、CPU、线程分析),支持远程监控;
- btrace:动态追踪工具,无需修改代码即可监控方法调用、参数和返回值。
工具选择指南
问题类型 | 推荐工具组合 | 核心操作 |
---|---|---|
GC 频繁 / 耗时过长 | jstat -gcutil + GC 日志 + GCEasy/GCViewer |
监控 GC 频率和耗时,分析日志中的 Young GC/Full GC 原因 |
内存泄漏 | jmap -histo:live + MAT + jstat -gc |
统计存活对象,生成堆快照,用 MAT 追踪泄漏对象的引用链 |
线程阻塞 / 死锁 | jstack + VisualVM/Arthas thread 命令 |
导出线程堆栈,查找 BLOCKED 线程和死锁信息 |
方法耗时过长 | Arthas trace /watch + perf top |
跟踪方法调用耗时,定位热点函数 |
生产环境在线诊断 | Arthas + jcmd |
避免重启,实时监控和调整参数 |
v1.3.10