JVM 性能监控

JVM(Java Virtual Machine)性能监控是保障 Java 应用稳定运行和性能优化的重要手段。通过一系列命令行工具,我们可以对 JVM 的运行状态、内存使用、线程状况、GC 行为等进行深入分析。


一、常用 JVM 性能监控命令

命令功能
jps查看本地正在运行的 Java 进程
jstat监控 JVM 内存和垃圾回收统计信息
jinfo查看和修改 JVM 配置参数
jmap生成堆内存快照(heap dump)或查看堆内存详细信息
jhat分析 heap dump 文件(不推荐,已被替代)
jstack生成线程快照,用于分析死锁、线程阻塞等问题
jcmd综合型诊断工具,支持多种 JVM 操作
VisualVM / JConsole / JMC图形化监控工具

二、各命令详解与实战应用

1. jps:查看 Java 进程

jps -l
  • 输出:

    12345 com.example.MyApp
    
  • 作用:列出当前机器上所有 Java 进程的 PID 和主类名。

  • 适用场景:配合其他命令使用,如 jstat、jmap 等。


2. jstat:JVM 统计监控工具

常用格式:
jstat -gc <pid> [interval] [count]
  • 示例:

    jstat -gc 12345 1000 5
    
  • 输出字段含义:

字段含义
S0C/S1CSurvivor 0/1 区容量(KB)
S0U/S1USurvivor 0/1 区已使用容量(KB)
EC/EUEden 区容量及使用量
OC/OUOld 区容量及使用量
MC/MUMetaspace 容量及使用量
CCSC/CCSU压缩类空间容量及使用量
YGC/YGCT新生代 GC 次数和耗时
FGC/FGCTFull GC 次数和耗时
GCT所有 GC 总时间
  • 用途:监控 GC 频率、内存分配情况、判断是否存在内存泄漏。

3. jinfo:查看或设置 JVM 参数

查看 JVM 参数:
jinfo <pid>
只查看系统属性和 JVM 参数:
jinfo -flags <pid>
修改可动态调整的参数(部分参数支持):
jinfo -flag [+/-]<name> <pid>

例如开启 PrintGC:

jinfo -flag +PrintGC 12345
  • 注意:不是所有参数都支持动态修改。

4. jmap:堆内存分析工具

查看堆内存概况:
jmap -heap <pid>
生成堆转储文件(heap dump):
jmap -dump:live,format=b,file=heap.bin <pid>
  • 用途:分析内存泄漏、对象占用情况,通常配合 MAT(Memory Analyzer Tool) 使用。
查看对象实例数量统计:
jmap -histo <pid> | head -n 20

输出示例:

num     #instances         #bytes  class name
---------------------------------------------
  1:     12345678        123456789  [C
  2:      1234567         12345678  java.lang.String
  • 用途:快速识别大对象或频繁创建的对象。

5. jstack:线程快照分析工具

获取线程堆栈信息:
jstack <pid> > thread_dump.log
  • 关键信息

    • 线程状态(RUNNABLE、BLOCKED、WAITING)
    • 线程持有锁、等待锁
    • 是否发生死锁(自动检测)
  • 用途

    • 分析线程阻塞、死锁问题
    • 判断是否有线程长时间阻塞在 I/O 或数据库操作

6. jcmd:多功能综合诊断命令

列出可用命令:
jcmd <pid> help
常用命令示例:
  • 生成线程快照

    jcmd <pid> Thread.print
    
  • 生成 heap dump

    jcmd <pid> GC.heap_dump /path/to/dump.hprof
    
  • 查看 JVM 参数

    jcmd <pid> VM.flags
    
  • 查看类加载信息

    jcmd <pid> VM.classloader_stats
    
  • 执行 GC

    jcmd <pid> GC.run
    
  • 优势:比多个单独命令更统一、功能更强。


三、图形化工具推荐

工具特点
VisualVM免费、开源,支持远程连接,可查看 CPU、内存、线程、GC、类加载等
JConsoleJDK 自带,简单易用,适合基础监控
JMC (Java Mission Control)商业级监控,低开销,支持飞行记录器(Flight Recorder),适合生产环境
MAT (Memory Analyzer)分析 heap dump,查找内存泄漏根源
Arthas (Alibaba 开源)强大的在线诊断工具,支持热更新、反编译、方法追踪等

四、案例:如何排查一次 Full GC 频繁问题

步骤如下:

  1. 使用 jps 查找目标进程

    jps -l
    
  2. 使用 jstat 观察 GC 情况

    jstat -gc 12345 1s 10
    
    • 关注 FGC 字段是否频繁增长,FGCT 是否显著增加。
  3. 使用 jmap 生成堆转储

    jmap -dump:live,format=b,file=heap.bin 12345
    
  4. 使用 MAT 打开 heap.bin 分析

    • 查看 Dominator Tree,找出占用内存最多的对象
    • 检查是否有内存泄漏(如缓存未释放、监听器未注销等)
  5. 结合 jstack 分析线程行为

    jstack 12345 > thread.log
    
    • 检查是否有大量线程处于 WAITING/BLOCKED 状态
  6. 根据分析结果优化代码或调优 JVM 参数


五、建议与最佳实践

  • 定期监控 GC 情况:避免频繁 Full GC 导致服务卡顿。
  • 合理配置堆大小:Xms/Xmx 设置相同,减少内存抖动。
  • 避免内存泄漏:及时释放无用对象,特别是静态集合类、监听器、ThreadLocal。
  • 启用 Native Memory Tracking(NMT):排查 native 内存泄露
    -XX:NativeMemoryTracking=summary
    jcmd <pid> VM.native_memory summary
    
  • 使用 Arthas 在线诊断复杂问题:如方法耗时、异常堆栈、SQL 执行等。

六、总结

场景推荐命令
查看 Java 进程jps
监控内存与 GCjstat
查看 JVM 参数jinfo
分析堆内存jmap
分析线程问题jstack
多功能诊断jcmd
可视化监控VisualVM / JMC
内存泄漏分析MAT
生产环境在线诊断Arthas

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值