Java命令::jstat

jstat是用于监控虚拟机运行状态信息的命令,可以显示虚拟机进程中的类装载、内存使用、GC情况、JIT编译等运行状态数据,能够在Linux上快速定位虚拟机性能问题。

jstat命令在jdk的bin目录下,目录中还有很多实用的命令

*以下分析是基于jdk1.8+

jstat命令格式:

1
2
3
4
5
6
7
8
9
jstat -<option> <pid> [<interval> [<count>]]

---
option: 需要查看的虚拟机信息
pid: Java程序进程号
本地虚拟机: pid
远程虚拟机: [protocol:][//] lvmid [@hostname[:port]/servername]
interval: 监控间隔时间,可选,默认立刻执行一次
count: 监控次数,可选,默认无限次
option 说明
class 查看类装载、卸载数量、总空间及类装载所耗时间
gc 查看Java堆状况,包括Eden、survivor、老年代、永久代的容量
gcutil 类似于gc,主要输出各区域空间使用占比
gccause 同gc,会多输出每次gc的原因
gccapacity 同gc,但输出的主要是Java堆各个区域使用到的最大、最小空间
gcnew 查看新生代的使用情况
gcnewcapacity 同gcnew,输出内容主要关注新生代的最大、最小空间
gcold 查看老年代的使用情况
gcoldcapacity 同gcold,输出内容主要关注老年代的最大、最小空间
gcpermcapacity 输出永久代使用到的最大、最小空间
compiler 输出JIT编译器编译过的方法、耗时等信息
printcompilation 输出已经被JIT编译的方法

🌰

  1. jstat -class <pid> : 显示加载class的数量及所占空间等信息
1
2
3
4
5
6
7
8
9
10
[root@master0 ~]# jstat -class 19080
Loaded Bytes Unloaded Bytes Time
11512 22276.9 268 421.6 18.41

---
Loaded: 装载类的数量
Bytes: 装载类所占用的字节数
Unloaded: 卸载类的数量
Bytes: 卸载类所占用的字节数
Time: 装载和卸载类所花费的时间
  1. jstat -gc <pid> : 显示gc的信息,查看gc的次数和时间
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
,等于YGCT + FGCT[root@master0 ~]# jstat -gc 19080 1000 1
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
6656.0 6656.0 0.0 3761.4 94208.0 51469.2 73728.0 50832.0 - - - - 20207 92.896 37 7.833 100.729

---
[容量为字节]
S0C: 年轻代第一个survivor区的总容量(survivor 0 capacity)
S1C: 年轻代第二个survivor区的总容量(survivor 1 capacity)
S0U: 年轻代第一个survivor区的已使用容量(survivor 0 using)
S1U: 年轻代第二个survivor区的已使用容量(survivor 1 using)
EC: 年轻代Eden区的总容量(Eden capacity)
EU: 年轻代Eden区的已使用容量(Eden using)
OC: 老年代的总容量(Old capacity)
OU: 老年代已使用的容量(Old using)
MC: Metaspace的总容量, jdk1.8+
MU: Metaspace已使用的容量, jdk1.8+
CCSC:压缩类空间容量, jdk1.8+
CCSU:压缩类空间已使用的容量, jdk1.8+
YGC: 服务启动至今年轻代gc的次数(young gc)
YGCT: 服务启动至今年轻代gc使用的时间,秒(young gc time)
FGC: 服务启动至今fullgc的次数
FGCT: 服务启动至今fullgc使用的时间,秒
GCT: 服务启动至今gc用的总时间,秒,等于YGCT + FGCT
  1. jstat -gcutil <pid> : 统计gc信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@master0 ~]# jstat -gcutil 19080 1000 3
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 48.90 20.83 69.35 - - 20221 93.006 37 7.833 100.838
0.00 48.90 20.83 69.35 - - 20221 93.006 37 7.833 100.838
0.00 48.90 20.83 69.35 - - 20221 93.006 37 7.833 100.838

---
S0: 年轻代第一个survivor已使用容量比例
S1: 年轻代第二个survivor已使用容量比例
E: 年轻代Eden区已使用容量比例
O: 老年代已使用容量比例
M: 元空间已使用容量比例
CCS: 压缩类空间已使用容量比例
YGC: 服务启动至今年轻代gc次数
YGCT: 服务启动至今年轻代gc所占用时间,秒
FGC: 服务启动至今fullgc次数
FGCT: 服务启动至今fullgc所占用时间,秒
GCT: 服务启动至今gc总占用时间,秒,等于YGCT + FGCT
  1. jstat -gccause <pid> : 查看gc原因
1
2
3
4
5
6
7
8
[root@master0 ~]# jstat -gccause 19080
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT LGCC GCC
57.32 0.00 13.35 69.36 - - 20222 93.015 37 7.833 100.848 Allocation Failure No GC

---
上述可以看到比-gcutil多处了一个LGCC和GCC
LGCC: 最近一次gc发生的原因(last gc cause)
GCC: 当前gc发生的原因
  1. jstat -gccapacity <pid> : 查看虚拟机中对象的使用和容量大小
1
2
3
4
5
6
7
8
9
10
[root@master0 ~]# jstat -gccapacity 19080
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC
20480.0 323584.0 112640.0 7680.0 6656.0 96768.0 40448.0 647168.0 73728.0 73728.0 - - - - - - 20223 37

---
[容量单位为字节]
NGC开头的表示:新生代空间容量
OGC开头的表示:老年代空间容量
MC开头的表示:元空间容量(Metaspace capacity)
CCS开头的表示:类压缩空间
  1. jstat -gcnew <pid> : 查看新生代gc情况
1
2
3
4
5
6
7
8
9
[root@master0 ~]# jstat -gcnew 19080
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
7680.0 6656.0 0.0 6354.4 15 15 7680.0 96768.0 95634.9 20223 93.023

---
[容量单位为字节]
TT: 老年化阈值,也可以理解为对象持有次数,就是在被移动到老年代之前,在新生代中存活的次数
MTT: 最大老年化阈值
DSS: Survivor区所需空间大小
  1. jstat -gcnewcapacity <pid> : 查看新生代空间容量
1
2
3
4
5
6
7
8
9
10
11
12
[root@master0 ~]# jstat -gcnewcapacity 19080
NGCMN NGCMX NGC S0CMX S0C S1CMX S1C ECMX EC YGC FGC
20480.0 323584.0 112128.0 107520.0 7168.0 107520.0 7168.0 322560.0 97280.0 20225 37

---
[容量单位为字节]
MN表示:最小
MX表示:最大
NGC开头表示:新生代空间总容量
S0C开头:新生代第一个survivor区容量
S1C开头:新生代第二个survivor区容量
EC开头:新生代Eden区容量
  1. jstat -gcold <pid> : 查看老年代gc情况
1
2
3
4
5
6
7
[root@master0 ~]# jstat -gcold 19080 1000
MC MU CCSC CCSU OC OU YGC FGC FGCT GCT
- - - - 73728.0 51144.0 20234 37 7.833 100.943
- - - - 73728.0 51144.0 20234 37 7.833 100.943

---
[容量单位为字节]
  1. jstat -gcoldcapacity <pid> : 查看老年代容量
1
2
3
4
[root@master0 ~]# jstat -gcoldcapacity 19080 100 2
OGCMN OGCMX OGC OC YGC FGC FGCT GCT
40448.0 647168.0 73728.0 73728.0 20235 37 7.833 100.949
40448.0 647168.0 73728.0 73728.0 20235 37 7.833 100.949
  1. jstat -gcpermcapacity <pid> : 查看perm中对象的信息和容量
1
jdk1.8+以上去除了该命令,如果你当前使用的是jdk1.7-,那么自行谷歌吧
  1. jstat -compiler <pid> : 查看虚拟机实时编译的信息
1
2
3
4
5
6
7
8
9
10
11
[root@master0 ~]# jstat -compiler 19080
Compiled Failed Invalid Time FailedType FailedMethod
2737 0 0 41.90 0

---
Compiled: 编译任务执行数量
Failed: 编译任务执行失败数量
Invalid: 编译任务执行失效数量
Time: 编译任务消耗的时间
FailedType: 最后一个编译失败任务的类型
FailedMethod: 最后一个编译失败的任务所在类及方法
  1. jstat -printcompilation <pid> : 查看虚拟机已经编译过的方法
1
2
3
4
5
6
7
8
9
[root@master0 ~]# jstat -printcompilation 19080
Compiled Size Type Method
2737 1562 1 sun/misc/FloatingDecimal dtoa

---
Compiled: 编译任务的数量
Size: 方法生成字节码的大小(单位:字节)
Type: 编译类型
Method: 类名和方法名用来标识编译的方法