---
url: /java/jvm常见工具.md
---
# 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+）**
   * **用途**：替代部分`jmap`、`jstack`功能，支持更多操作。
   * **示例**：
     * `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\. 使用`jmap`或`jcmd`生成堆转储。
     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`         |\
| 生成堆转储       | `jmap`、`jcmd`       | `-dump`、`GC.heap_dump` |\
| 分析线程栈       | `jstack`、`jcmd`     | `Thread.print`           |\
| 动态调整参数     | `jinfo`              | `-flag`                  |\
| 图形化监控       | VisualVM、JConsole   | 安装插件增强功能          |\
| 低开销记录       | JFR（JDK 7+）         | `-XX:+FlightRecorder`    |\
| 在线诊断         | Arthas               | `dashboard`、`thread`、`watch` |

***

## 六、注意事项

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

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

***

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