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:][ 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编译的方法 |
🌰
- 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: 装载和卸载类所花费的时间
|
- 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
|
- 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
|
- 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发生的原因
|
- 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开头的表示:类压缩空间
|
- 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区所需空间大小
|
- 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区容量
|
- 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
--- [容量单位为字节]
|
- 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
|
- jstat -gcpermcapacity <pid> : 查看perm中对象的信息和容量
1
| jdk1.8+以上去除了该命令,如果你当前使用的是jdk1.7-,那么自行谷歌吧
|
- 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: 最后一个编译失败的任务所在类及方法
|
- 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: 类名和方法名用来标识编译的方法
|