jstat 命令详解与实例(JDK 8+ 环境)
一、核心功能与语法
jstat(JVM Statistics Monitoring Tool)是 JDK 自带的轻量级监控工具,用于实时采集 JVM 内存、GC 事件、类加载等运行状态数据,帮助开发者快速诊断性能瓶颈12。
基础语法:
jstat -<option> <pid> [interval] [count]
option
:监控参数(如-gcutil
、-gc
等)pid
:目标 Java 进程 IDinterval
(可选):采样间隔时间(单位:毫秒)count
(可选):采样次数
二、常用参数与输出解析
-
-gcutil
(GC 利用率统计)
显示各内存区域的使用百分比及 GC 事件统计,适合快速查看内存压力。jstat -gcutil <pid> 1000 5 # 每秒采样 1 次,共 5 次
输出示例与字段解析:
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 0.00 72.47 35.50 45.20 95.11 91.45 150 3.440 8 0.295 3.735
S0/S1
:Survivor 区使用率(%)E
:Eden 区使用率(%)O
:老年代使用率(%)M
:元空间(Metaspace)使用率(%)YGC/YGCT
:年轻代 GC 次数/总耗时(秒)FGC/FGCT
:Full GC 次数/总耗时(秒)GCT
:所有 GC 总耗时(秒)13
-
-gc
(堆内存详细容量统计)
显示各内存区域的具体容量(单位:KB)及使用量。jstat -gc <pid> # 单次采样
输出示例与字段解析:
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT 20480 20480 0.0 13115 163840 113334 614400 436045 63872 61266 0 0 149 3.440 8 0.295 3.735
S0C/S1C
:Survivor 区总容量EC/EU
:Eden 区总容量/已使用容量OC/OU
:老年代总容量/已使用容量MC/MU
:元空间总容量/已使用容量36
-
其他常用参数
-class
:类加载/卸载统计(示例:jstat -class <pid>
)-gccapacity
:各内存区域容量阈值(如新生代最小/最大容量)-gccause
:显示最近一次 GC 的原因(如Allocation Failure
)56
三、调优场景与实例
-
诊断内存泄漏
若老年代使用率(O
)持续增长且 Full GC 后无明显下降:
jstat -gcutil <pid> 2000 # 每 2 秒采样一次,观察 O 列变化
输出分析:若
O
值从 70% → 85% → 95% 持续上升,可能存在内存泄漏13。 -
优化 GC 停顿时间
若YGCT
(年轻代 GC 耗时)过高:jstat -gc <pid> 1000 10 # 每秒采样,观察 EU(Eden 使用量)增长速率
调优方向:若 Eden 区快速填满(如每秒增加 200MB),可增大
-Xmn
(年轻代大小)降低 GC 频率35。