jstat 详解
jstat 详解
1. 概述
jstat(Java Virtual Machine Statistics Monitoring Tool) 是 JDK 自带的命令行工具,用于监控 JVM 运行时状态,包括类加载、GC、堆内存、编译等统计信息。无需图形界面,非常适合服务端性能监控与调优。
2. 命令格式
jstat [options] <vmid> [interval] [count]
options
: 监控选项(详见下文)。vmid
: JVM 进程 ID(通过jps
或ps
获取)。interval
: 采样间隔时间(毫秒)。count
: 采样次数(默认为持续输出)。
3. 常用选项
选项 | 说明 |
---|---|
-class |
监控类加载/卸载数量及耗时(Loaded/Unloaded/Time)。 |
-compiler |
显示 JIT 编译器编译的方法数量及耗时。 |
-gc |
堆内存各区域容量(Capacity)及实际使用量(Usage),包含 GC 次数/时间。 |
-gccapacity |
堆内存各区域的容量(最小/最大/当前)。 |
-gcutil |
以百分比显示堆内存使用率,并输出 GC 统计。 |
-gccause |
同 -gcutil ,额外显示最近一次和当前 GC 的原因(如 Allocation Failure)。 |
-gcnew |
新生代(Young Gen)内存统计。 |
-gcold |
老年代(Old Gen)内存统计。 |
-gcmetacapacity |
元空间(Metaspace)容量统计(JDK8+)。 |
4. 核心参数详解
4.1 -gc
输出字段
字段 | 含义 | 示例 |
---|---|---|
S0C | Survivor 0 区容量(KB) | 10240.0 |
S1C | Survivor 1 区容量 | 10240.0 |
S0U | Survivor 0 区已使用量 | 0.0 |
S1U | Survivor 1 区已使用量 | 1024.0 |
EC | Eden 区容量 | 81920.0 |
EU | Eden 区已使用量 | 40960.0 |
OC | 老年代容量 | 204800.0 |
OU | 老年代已使用量 | 102400.0 |
YGC | Young GC 次数 | 100 |
YGCT | Young GC 总耗时(秒) | 5.456 |
FGC | Full GC 次数 | 3 |
FGCT | Full GC 总耗时 | 1.234 |
GCT | GC 总耗时 | 6.690 |
4.2 -gcutil
输出字段(百分比形式)
字段 | 含义 | 示例 |
---|---|---|
S0 | Survivor 0 区使用率 | 50.00 |
S1 | Survivor 1 区使用率 | 0.00 |
E | Eden 区使用率 | 75.25 |
O | 老年代使用率 | 85.30 |
M | 元空间(Metaspace)使用率 | 95.80 |
CCS | 压缩类空间(Compressed Class Space)使用率 | 80.50 |
YGC | Young GC 次数 | 200 |
YGCT | Young GC 总耗时 | 10.20 |
FGC | Full GC 次数 | 5 |
FGCT | Full GC 总耗时 | 3.50 |
GCT | 总 GC 耗时 | 13.70 |
5. 使用示例
监控进程 12345 的 GC 情况(每秒采样,共 5 次)
jstat -gcutil 12345 1000 5
输出示例:
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 50.0 75.3 85.30 95.80 80.50 200 10.20 5 3.50 13.70
分析:
- 老年代(O)使用率 85.3%,接近容量上限,可能触发 Full GC。
- Full GC 已发生 5 次,耗时长(3.5秒),需检查内存泄漏或调整堆大小。
6. 常见问题诊断
- 频繁 Young GC:Eden 区增速快(EU迅速增长),考虑增大
-Xmn
(新生代大小)。 - Full GC 频繁/Old 区未释放:可能存在内存泄漏,检查对象生命周期或使用
jmap
分析堆转储。 - 元空间(M)使用率高:调整
-XX:MetaspaceSize
和-XX:MaxMetaspaceSize
。
7. 注意事项
- JDK 版本差异:JDK8 前为永久代(PermGen,显示为
P
),JDK8+ 为元空间(Metaspace,显示为M
)。 - 结合其他工具:
jstat
仅提供统计数据,深入分析需配合jstack
(线程栈)、jmap
(堆转储)或 VisualVM。 - 容器环境:若在 Docker/K8s 中使用,确保正确获取容器内 JVM 的 PID。
通过熟练使用 jstat
,开发者可以快速定位 JVM 性能瓶颈,尤其在 GC 调优和内存溢出问题的排查中效果显著。