Skip to content

JVM常见工具总结

一、基础命令行工具(JDK自带)

  1. jps:查看Java进程

    • 用途:列出当前用户的所有Java进程,包含主类及JVM参数。
    • 命令示例jps -lvm(显示PID、主类、JVM参数)。
    • 输出示例:如 1234 com.example.MainApp -Xmx2G
  2. jstat:监控JVM统计信息

    • 用途:实时查看堆内存、GC活动、类加载等数据。
    • 常用命令
      • jstat -gc <pid> 1000 10:每秒输出一次GC数据,共10次。
      • jstat -gcutil <pid>:显示各内存区域使用百分比。
    • 关键指标
      • S0C/S1C:Survivor区容量。
      • EU:Eden区使用量。
      • OGC/OU:老年代容量/使用量。
      • YGC/YGCT:Young GC次数/耗时。
      • FGC/FGCT:Full GC次数/耗时。
  3. jinfo:查看/修改JVM参数

    • 用途:动态查看或调整运行中JVM参数。
    • 示例
      • jinfo -flags <pid>:查看所有参数。
      • jinfo -flag +PrintGC <pid>:启用GC日志打印。
  4. jmap:生成堆内存快照

    • 用途:分析内存泄漏、对象分布。
    • 常用命令
      • jmap -dump:format=b,file=heap.hprof <pid>:生成堆转储文件。
      • jmap -histo <pid>:显示堆中对象统计(直方图)。
    • 分析工具:需配合MAT或VisualVM解析.hprof文件。
  5. jstack:生成线程快照

    • 用途:诊断线程死锁、高CPU问题。
    • 命令示例jstack -l <pid> > thread_dump.txt
    • 分析技巧
      • 死锁检测:搜索输出中的deadlock关键字。
      • 高CPU线程定位:结合top -Hp <pid>获取线程ID,转16进制后在jstack输出中查找。
  6. jcmd:多功能诊断工具(JDK 7+)

    • 用途:替代部分jmapjstack功能,支持更多操作。
    • 示例
      • jcmd <pid> GC.heap_dump filename=heap.hprof:生成堆转储。
      • jcmd <pid> Thread.print:打印线程栈(等效于jstack)。
      • jcmd <pid> VM.flags:查看JVM参数。

二、图形化工具

  1. JConsole

    • 启动方式jconsole
    • 功能
      • 实时监控堆内存、线程、类加载、MBean。
      • 检测死锁、手动执行GC。
    • 适用场景:快速查看JVM总体状态。
  2. VisualVM

    • 启动方式jvisualvm
    • 功能
      • 分析堆转储、线程转储。
      • 抽样器监控CPU、内存分配。
      • 安装插件(如Visual GC)增强功能。
    • 优势:集成多种工具,适合深度分析。
  3. Java Mission Control(JMC)

    • 用途:配合JDK Flight Recorder(JFR)实现低开销性能监控。
    • 启用JFR:需在启动时添加参数 java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder ...
    • 功能
      • 记录CPU、内存、IO事件。
      • 生成详细分析报告。

三、高级工具与技巧

  1. JHSDB(JDK 9+)

    • 用途:分析堆、线程及JVM内部数据结构。
    • 启动方式
      • 命令行模式:jhsdb clhsdb
      • 生成堆转储:jhsdb jmap --pid <pid> --dumpfile heap.hprof
  2. Arthas(阿里开源工具)

    • 功能
      • 动态跟踪方法调用、反编译代码、监控线程状态。
      • 支持在线诊断。
    • 常用命令
      • dashboard:实时监控面板。
      • thread -n 3:查看最忙的3个线程。
      • watch com.example.Service * '{params, returnObj}':观察方法入参和返回值。
  3. GC日志分析

    • 启用方式
      • JDK 9+:-Xlog:gc*:file=gc.log:time:filecount=5,filesize=10M
      • JDK 8:-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log
    • 分析工具:GCViewer、GCEasy(用于可视化GC日志)。

四、典型故障排查流程

  1. 内存泄漏(OOM)

    • 步骤
      0. 使用jmapjcmd生成堆转储。
      1. 用MAT分析:查找Retained Heap较高的对象。
      2. 检查代码中未关闭的资源(如数据库连接、流)。
  2. CPU使用率过高

    • 步骤
      0. top -Hp <pid>:定位高CPU线程ID。
      1. 转换线程ID为16进制(如printf "%x" 1234)。
      2. jstack <pid>:查找对应线程栈,定位问题代码。
  3. 线程死锁

    • 步骤
      0. jstack <pid>:获取线程栈信息。
      1. 搜索deadlock关键字,分析死锁线程及锁信息。
      2. 检查同步块或锁顺序问题。

五、命令速查表

场景工具/命令关键参数
查看Java进程jps-lvm(显示详细信息)
监控GC活动jstat-gc-gcutil
生成堆转储jmapjcmd-dumpGC.heap_dump
分析线程栈jstackjcmdThread.print
动态调整参数jinfo-flag
图形化监控VisualVM、JConsole安装插件增强功能
低开销记录JFR(JDK 7+)-XX:+FlightRecorder
在线诊断Arthasdashboardthreadwatch

六、注意事项

  1. 生产环境操作:生成堆转储或频繁监控可能影响性能,需谨慎使用。
  2. 权限要求:部分工具(如jmap)需与目标JVM相同用户权限。
  3. JDK版本适配:部分功能(如jcmd、JFR)需特定版本支持(JDK 7+)。

监控工具:JConsole、VisualVM、Prometheus+Grafana(生产环境); 分析工具:MAT(内存泄漏分析)、JProfiler(性能剖析)、GC日志分析工具(GCEasy); 命令行:jps(进程查询)、jstat(GC统计)、jmap(内存快照)、jstack(线程栈)、jhat(快照分析)


总结:掌握jpsjstatjmapjstackjcmd等命令行工具及JConsole、VisualVM、JMC等图形化工具,结合GC日志分析和Arthas在线诊断,可高效定位JVM性能问题。建议优先通过监控收集数据,再针对性分析。

更新于:

note