第2章

🔍 JVM监控工具详解

深入学习JVM监控工具的使用,建立完整的JVM监控体系

学习目标

JDK自带监控工具

JDK提供了一系列强大的命令行工具,用于监控和诊断JVM的运行状态。这些工具是JVM调优的基础,每个Java开发者都应该熟练掌握。

核心理解

JDK自带工具虽然功能强大,但大多数是命令行工具,需要结合脚本使用才能发挥最大效果。

核心工具概览

jps - Java进程状态
显示系统中所有Java进程的PID和主类名,是其他工具的基础。
jstat - JVM统计信息
实时监控JVM的运行状态,包括GC、内存、类加载等信息。
jmap - 内存映像工具
生成堆转储快照,分析内存使用情况和内存泄漏问题。
jstack - 线程堆栈跟踪
生成线程快照,分析线程状态和死锁问题。

jps - Java进程状态工具

jps(Java Virtual Machine Process Status Tool)是最基础的工具,用于列出系统中所有Java进程。

基本用法示例
# 显示所有Java进程 jps # 显示进程ID和主类全名 jps -l # 显示传递给main方法的参数 jps -m # 显示JVM参数 jps -v # 组合使用 jps -lvm

jstat - JVM统计信息监控

jstat是最重要的性能监控工具之一,可以实时监控JVM的各种运行状态信息。

常用监控选项
# 监控垃圾回收情况 jstat -gc [pid] [interval] [count] # 监控垃圾回收统计 jstat -gcutil [pid] [interval] [count] # 监控新生代GC情况 jstat -gcnew [pid] [interval] [count] # 监控老年代GC情况 jstat -gcold [pid] [interval] [count] # 监控类加载情况 jstat -class [pid] [interval] [count] # 示例:每秒监控一次GC情况,共监控10次 jstat -gc 12345 1s 10

jmap - 内存映像工具

jmap用于生成堆转储快照(heap dump),是分析内存问题的重要工具。

主要功能
# 生成堆转储文件 jmap -dump:format=b,file=heapdump.hprof [pid] # 生成存活对象的堆转储 jmap -dump:live,format=b,file=heapdump.hprof [pid] # 显示堆内存使用情况 jmap -heap [pid] # 显示堆中对象统计信息 jmap -histo [pid] # 显示存活对象统计信息 jmap -histo:live [pid]

jstack - 线程堆栈跟踪

jstack用于生成线程快照,帮助分析线程状态、死锁等问题。

使用示例
# 生成线程快照 jstack [pid] # 强制生成线程快照(当进程无响应时) jstack -F [pid] # 生成线程快照并输出到文件 jstack [pid] > thread_dump.txt # 检测死锁 jstack -l [pid]

可视化监控工具

虽然命令行工具功能强大,但可视化工具能够提供更直观的监控界面,提高分析效率。

工具对比

工具名称 类型 优势 适用场景
JConsole JDK自带 免费、简单易用 基础监控、学习使用
VisualVM 开源 功能丰富、插件支持 开发测试环境
JProfiler 商业 专业强大、界面友好 生产环境、深度分析
MAT 开源 内存分析专业 内存泄漏分析

JConsole - 基础监控工具

主要功能
  • 实时监控内存使用情况
  • 监控线程状态和数量
  • 查看类加载情况
  • 监控MBean信息
启动方式
# 直接启动 jconsole # 连接远程JVM jconsole hostname:port

VisualVM - 多功能分析工具

VisualVM是一个功能强大的可视化工具,集成了多种JDK工具的功能。

核心特性
  • 性能分析:CPU和内存性能分析
  • 堆转储分析:内存泄漏检测
  • 线程分析:线程状态监控
  • 插件支持:丰富的插件生态

第三方监控工具

第三方工具通常提供更专业的功能和更好的用户体验,是生产环境监控的重要选择。

Arthas - 阿里巴巴开源诊断工具

核心优势
  • 无需重启应用
  • 实时查看和修改
  • 强大的命令行界面
  • 支持Web控制台
常用命令
# 查看JVM信息 dashboard # 监控方法调用 watch com.example.Service method # 查看线程信息 thread # 查看堆内存 heapdump

MAT - 内存分析工具

Eclipse Memory Analyzer Tool (MAT) 是专业的内存分析工具,特别适合分析大型堆转储文件。

分析功能
  • 内存泄漏检测:自动识别可能的内存泄漏
  • 对象引用分析:查看对象的引用关系
  • 支配树分析:找出占用内存最多的对象
  • OQL查询:使用类SQL语法查询对象

JProfiler - 商业性能分析工具

JProfiler是业界领先的Java性能分析工具,提供全面的性能监控和分析功能。

CPU分析
方法调用树、热点方法识别、调用图分析
内存分析
堆遍历、内存泄漏检测、对象分配跟踪
线程分析
线程状态监控、死锁检测、同步分析

监控指标体系

建立完整的监控指标体系是JVM调优的基础,需要关注CPU、内存、GC、线程等多个维度。

关键监控指标

CPU指标
  • CPU使用率
  • GC占用CPU时间
  • 应用线程CPU时间
  • 系统负载
内存指标
  • 堆内存使用率
  • 非堆内存使用率
  • 各代内存使用情况
  • 直接内存使用量
GC指标
  • GC频率和耗时
  • 各代GC次数
  • GC吞吐量
  • GC暂停时间
线程指标
  • 线程总数
  • 活跃线程数
  • 阻塞线程数
  • 死锁检测
告警阈值建议
  • 堆内存使用率:超过80%需要关注
  • GC频率:Full GC频率过高需要优化
  • GC耗时:单次GC超过100ms需要关注
  • 线程数:线程数持续增长需要检查

监控实战案例

通过实际案例学习如何使用监控工具发现和解决问题。

💻 查看完整代码 - 在线IDE体验

案例1:内存泄漏检测

问题现象
# 使用jstat监控发现老年代内存持续增长 jstat -gc 12345 5s # 输出显示老年代使用率不断上升 S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT 2048.0 2048.0 0.0 48.0 16384.0 8192.0 32768.0 25600.0 21248.0 20480.0 2560.0 2304.0 245 2.456 5 0.345 2.801
分析步骤
# 1. 生成堆转储文件 jmap -dump:live,format=b,file=heap.hprof 12345 # 2. 使用MAT分析堆转储文件 # 查看内存泄漏报告 # 分析支配树找出大对象 # 查看对象引用关系 # 3. 使用jstack分析线程状态 jstack 12345 > threads.txt

案例2:高CPU使用率分析

分析流程
# 1. 找出CPU使用率最高的Java进程 top -p `jps -q` # 2. 找出该进程中CPU使用率最高的线程 top -H -p [pid] # 3. 将线程ID转换为16进制 printf "%x\n" [thread_id] # 4. 在线程快照中查找对应线程 jstack [pid] | grep [hex_thread_id] -A 20
上一章:JVM基础理论 返回目录 下一章:内存管理与调优