0%

监控工具

JVM 监控工具全指南:从命令行到可视化工具

监控是 JVM 性能优化和问题排查的基础。JDK 自带了丰富的命令行工具,同时还有多种可视化工具,覆盖从进程监控、GC 分析、内存快照到线程跟踪的全场景。本文将系统梳理这些工具的功能、用法及适用场景,帮助开发者快速定位和解决 JVM 相关问题。

JDK 自带命令行工具

命令行工具轻量高效,适合在服务器环境中快速排查问题,核心工具包括 jpsjstatjinfojmapjstackjcmd 等。

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
2
3
4
jps -l  # 显示进程 ID 和主类全路径
# 输出:
# 12345 com.example.Application
# 67890 org.springframework.boot.loader.JarLauncher

注意:若 Java 进程启动时添加了 -XX:-UsePerfDatajps 将无法探测到该进程。

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
2
# 每 2000ms 监控一次 GC 百分比,共 5 次,带时间戳和表头(每 2 行)
jstat -gcutil -t -h2 12345 2000 5

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
2
jinfo -flags 12345  # 查看进程 12345 的所有 JVM 参数
jinfo -flag PrintGCDetails 12345 # 查看是否开启 GC 详细日志

注意:仅 java -XX:+PrintFlagsFinal -version | grep manageable 列出的参数可动态修改。

jmap:内存快照与对象统计

功能:生成堆内存快照(dump 文件)、统计存活对象分布,是分析内存泄漏和大对象的关键工具。

用法

1
jmap [option] <pid>

核心选项

  • -histo[:live]:统计堆中对象数量和大小(live 仅统计存活对象);
  • -heap:输出堆内存详细信息(如分代大小、GC 收集器类型);
  • -dump:<dump-options>:生成堆快照(format=b 表示二进制格式);
  • -F:强制生成快照(当进程无响应时)。

示例

1
2
3
4
5
# 统计存活对象(会触发 Full GC)
jmap -histo:live 12345 | head -10 # 显示前 10 行

# 生成存活对象的堆快照(保存到 heap.bin)
jmap -dump:live,format=b,file=heap.bin 12345

自动生成快照:启动时添加 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
2
jstack -l 12345 > stack.log  # 导出线程堆栈到文件
grep "BLOCKED" stack.log # 统计阻塞线程数

jcmd:多功能命令行工具

功能:集成了 jpsjinfojmapjstack 等工具的功能,支持更多高级操作(如手动触发 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
2
3
jcmd 12345 Thread.print  # 打印线程堆栈
jcmd 12345 GC.heap_dump /tmp/jcmd_heap.bin # 生成堆快照
jcmd 12345 VM.uptime # 查看进程启动时间

可视化监控工具

可视化工具更直观,适合实时监控和复杂分析,尤其适合开发和测试环境。

VisualVM(JDK 自带)

功能:集成了性能分析、内存监控、线程分析、堆快照分析等功能,支持插件扩展(如 GC 监控插件)。

核心功能

  • 概览:显示进程基本信息(PID、主类、JVM 参数);

  • 监控:实时跟踪 CPU、堆内存、类加载、线程数量;

  • 线程:查看线程状态及堆栈,检测死锁;

  • 抽样器:CPU 和内存抽样,定位热点方法和大对象;

  • 堆 Dump:生成并分析堆快照。

启动:JDK 目录下执行 jvisualvm,支持本地和远程进程(需配置 JMX 参数)。

远程连接配置
启动 Java 进程时添加参数:

1
2
3
4
5
6
java -Djava.rmi.server.hostname=<远程IP> \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=8888 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-jar app.jar

JConsole(JDK 自带)

功能:轻量级可视化工具,监控内存、线程、类加载、VM 信息等,适合快速查看基本状态。

核心功能

启动: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 避免重启,实时监控和调整参数

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10