jps/jstat/jinfo/jmap/jhat 命令
JDK 命令行工具:一线诊断利器
JVM 自带了一系列命令行诊断工具,部署在 $JAVA_HOME/bin 目录下。它们是排查问题的第一线武器——轻量、快速、不需要额外安装。
这一节详细介绍 jps、jstat、jinfo、jmap、jhat 五个工具。
jps:查看 Java 进程
基本用法
jps 是 JVM 进程状态工具,类似于 Linux 的 ps,但只显示 Java 相关进程:
bash
jps [options] [hostid]常用选项
bash
# 查看所有 Java 进程
jps
# 输出:
# 12345 Jps
# 67890 Application
# 11111 Bootstrap
# 查看完整类名和参数
jps -l
# 输出:
# 12345 sun.tools.jdk.jps.Jps
# 67890 com.example.MyApplication
# 11111 org.apache.catalina.startup.Bootstrap
# 查看传递给 JVM 的参数
jps -v
# 输出:
# 67890 MyApplication -Xmx1024m -Xms256m -XX:+UseG1GC ...jps 输出字段
jps 输出:
PID 类名/主类名
jps -l 输出:
PID 完整类名
jps -v 输出:
PID 类名/主类名 JVM 参数常用场景
bash
# 1. 快速找到 Java 进程 PID
jps | grep MyApplication
# 2. 找到所有 Java 进程
jps -lm
# 3. 查看远程服务器上的 Java 进程
jps rmi://hostname:portjstat:统计信息监控
jstat 是 JVM 统计信息监控工具,用于观察 GC、类加载、编译等信息。
基本用法
bash
jstat -<option> <pid> [interval] [count]GC 统计:-gcutil
最常用的选项,监控 GC 内存使用率:
bash
jstat -gcutil 67890 1000 10
# 输出:
# S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
# 0.00 35.00 67.00 42.00 96.00 94.00 15 0.230 0 0.000 0.230字段说明:
| 列 | 含义 | 说明 |
|---|---|---|
| S0 | Survivor 0 区使用率 | From 区 |
| S1 | Survivor 1 区使用率 | To 区 |
| E | Eden 区使用率 | 伊甸园区 |
| O | Old 区使用率 | 老年代 |
| M | Metaspace 使用率 | 元空间(JDK 8+) |
| CCS | Compressed Class Space | 压缩类空间 |
| YGC | Young GC 次数 | Minor GC 总次数 |
| YGCT | Young GC 总耗时 | 秒 |
| FGC | Full GC 次数 | Full GC 总次数 |
| FGCT | Full GC 总耗时 | 秒 |
| GCT | GC 总耗时 | 秒 |
详细 GC 容量:-gc
bash
jstat -gc 67890
# 输出:
# S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
# 1024.0 1024.0 0.0 358.4 8192.0 5478.4 16384.0 6892.1 48640.0 46778.1 6144.0 5491.6 15 0.230 0 0.000 0.230容量字段说明:
S0C = S0 Capacity(From 区容量,KB)
S1C = S1 Capacity(To 区容量,KB)
EC = Eden Capacity(Eden 区容量,KB)
OC = Old Capacity(老年代容量,KB)
MC = Metaspace Capacity(元空间容量,KB)类加载统计:-class
bash
jstat -class 67890
# 输出:
# Loaded Bytes Unloaded Bytes Gc
# 3254 6789.2 0 0.0 0
# 含义:
# Loaded → 已加载类数量
# Bytes → 已加载类占用的字节数
# Unloaded → 已卸载类数量
# Gc → 类回收触发次数JIT 编译统计:-compiler
bash
jstat -compiler 67890
# 输出:
# Compiled Failed Invalid Time FailedType FailedMethod
# 1250 0 0 45.23 0实时监控示例
bash
# 每秒输出一次 GC 状态,共 20 次
jstat -gcutil 67890 1000 20
# 每 500ms 输出一次,共 100 次(高频监控)
jstat -gcutil 67890 500 100
# 监控 Full GC 次数
watch -n 1 'jstat -gcutil 67890 | grep FGC'jinfo:查看和修改 JVM 参数
基本用法
bash
jinfo <pid>查看当前 JVM 参数
bash
jinfo 67890
# 输出(部分):
# Java System Properties:
# java.runtime.name = Java(TM) SE Runtime Environment
# java.class.version = 61.0
# user.home = /home/app
#
# VM Flags:
# -Xmx1024m -Xms256m -XX:+UseG1GC ...查看所有 JVM 选项
bash
# 查看所有可管理的 JVM 参数(PrintFlagsFinal 中的参数)
jinfo -flags 67890
# 查看指定参数
jinfo -flag MaxHeapSize 67890
# 输出:-XX:MaxHeapSize=1073741824
jinfo -flag PrintGCDetails 67890
# 输出:-XX:+PrintGCDetails动态修改参数
bash
# 开启参数(布尔类型)
jinfo -flag +PrintGCDetails 67890
# 关闭参数
jinfo -flag -PrintGCDetails 67890
# 设置值
jinfo -flag MaxHeapSize=2g 67890
# 注意:只有 -XX:+Manageable 或 -XX:+Debuggable 的参数才能动态修改实际应用场景
bash
# 场景:临时开启 GC 日志用于诊断
jinfo -flag +PrintGCDetails 67890
jinfo -flag +PrintGCDateStamps 67890
# 诊断完成后关闭
jinfo -flag -PrintGCDetails 67890jmap:内存映射工具
jmap 用于生成堆转储(heapdump)和查看内存信息。
基本用法
bash
jmap [option] <pid>查看堆使用情况
bash
jmap -heap 67890
# 输出:
# Heap Configuration:
# MaxHeapSize = 4294967296 (4096.0MB)
# InitialHeapSize = 268435456 (256.0MB)
# NewSize = 134217728 (128.0MB)
# MaxNewSize = 143130624 (137.0MB)
# OldSize = 268435456 (256.0MB)
# SurvivorRatio = 8
# MetaspaceSize = 21807104 (20.8MB)
# CompressedClassSpaceSize = 1073741824 (1024.0MB)
#
# Heap Usage:
# G1 Heap:
# region size = 1024K
# regions = 4096
# capacity = 4294967296 (4096.0MB)
# used = 1849688064 (1764.0MB)
# free = 2445279232 (2332.0MB)
# 43.05% used生成堆转储(heapdump)
bash
# 方式一:jmap(转储整个堆)
jmap -dump:format=b,file=heap.hprof 67890
# 方式二:jmap(live 子选项,只转储存活对象)
jmap -dump:live,format=b,file=live_heap.hprof 67890
# 方式三:JVM 参数自动转储(OOM 时)
java -XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/path/to/dumps \
-jar myapp.jar关键区别:-dump 和 -dump:live
jmap -dump:format=b,file=heap.hprof <pid>
→ 转储整个堆(包括死对象),文件大,但保留完整内存状态
jmap -dump:live,format=b,file=heap.hprof <pid>
→ 先执行 Full GC,再转储存活对象
→ 文件小,分析效率高,但会触发 Full GC
→ 推荐使用查看类直方图
bash
# 查看所有类的实例数量和内存占用
jmap -histo 67890 | head -30
# 输出:
# num #instances #bytes class name (module)
# -------------------------------------------------------
# 1: 12345 8901234 [Ljava.lang.Object;
# 2: 6789 1234567 [Ljava.lang.String;
# 3: 4567 987654 com.example.MyClass
# ...
# 查看活跃对象的直方图(live)
jmap -histo:live 67890 | head -30常用场景
bash
# 1. 诊断内存泄漏:生成堆转储
jmap -dump:live,format=b,file=heap_$(date +%Y%m%d_%H%M%S).hprof 67890
# 2. 快速查看内存占用
jmap -heap 67890 | grep used
# 3. 查看哪些类占用最多内存
jmap -histo 67890 | sort -k3 -rn | head -20jhat:堆分析工具(已过时)
jhat 是 JDK 内置的堆转储分析工具,但功能有限,已被更专业的工具取代。
基本用法
bash
jhat heap.hprof
# 启动 HTTP 服务器,默认端口 7000
# 访问 http://localhost:7000 查看分析结果局限性
jhat 的局限:
1. 功能简单,只能做基础查询
2. 不支持大堆转储(内存消耗大)
3. UI 简陋,分析效率低
4. 已被 MAT、JProfiler 等工具替代
推荐替代工具:
- MAT(Memory Analyzer Tool)→ 免费,功能强大
- JProfiler → 商业软件,界面友好
- VisualVM → 免费,JDK 自带命令行工具组合拳
诊断问题时,常用以下组合:
bash
# 场景:CPU 突然飙升
# 第一步:找到进程
jps | grep MyApp
# 输出:67890 com.example.MyApp
# 第二步:查看 CPU 使用情况
top -p 67890
# 第三步:查看 GC 情况
jstat -gcutil 67890 1000 5
# 第四步:生成堆转储
jmap -dump:live,format=b,file=heap.hprof 67890
# 第五步:用 MAT 分析堆转储
# (打开 MAT,加载 heap.hprof)本节小结
JDK 命令行工具速查:
| 命令 | 核心功能 | 常用选项 |
|---|---|---|
| jps | 查看 Java 进程 | -l 完整类名,-v JVM 参数 |
| jstat | GC/类/JIT 统计 | -gcutil GC 使用率,-class 类加载 |
| jinfo | 查看/修改 JVM 参数 | -flags 所有参数,-flag +/- 动态开关 |
| jmap | 堆内存工具 | -heap 堆信息,-dump 转储,-histo 直方图 |
| jhat | 堆转储分析 | 已过时,用 MAT 替代 |
这五个工具是 JVM 诊断的基础,配合使用可以解决大部分性能问题。
下一节,我们来看 jstack/jcmd/jstatd 命令。
