利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对进程的classloader,compiler,gc情况;可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量,以及加载类的数量。
Java 虚拟机进程状态工具JSTAT
语法
jstat [option vmid [interval [s|ms][count]] [count]] ]
options
work@authority-schedule-v1-fbf4cfd6d-86zhw:~$ jstat -options
-class
-compiler
-gc
-gccapacity
-gccause
-gcmetacapacity
-gcnew
-gcnewcapacity
-gcold
-gcoldcapacity
-gcutil
-printcompilation
jstat工具主要选项
选项 | 作用 |
---|---|
-class | 监视类装载、卸载数量、总空间以及类装载所耗费的时间 |
-compiler | 输出JIT编译器编译过的方法、耗时等信息 |
-gc | 监视Java堆状况,包括Eden区、两个survivor区、老年代、元空间的容量、已用空间、GC时间合计等信息 |
-gccapacity | 监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大、最小空间 |
-gccause | 与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因 |
-gcmetacapacity | 输出元数据用到的最大、最小空间 |
-gcnew | 监视新生代GC状况 |
-gcnewcapacity | 监视内容与-gcnew基本相同,输出主要关注使用到的最大、最小空间 |
-gcold | 监视老年代状况 |
-gcoldcapacity | 监视内容与-gcold基本相同,输出主要关注用到的最大、最小空间 |
-gcutil | 监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比 |
-printcompilation | 输出已经被JIT编译的方法 |
示例:
以下输出空间单位都是KB,时间单位都是s
类加载统计
Loaded:加载class的数量
Bytes:所占用空间大小
Unloaded:未加载数量
Bytes:未加载占用空间
Time:时间
work@authority-schedule-v1-fbf4cfd6d-86zhw:~$ jstat -class 47
Loaded Bytes Unloaded Bytes Time
12225 23448.0 0 0.0 16.53
编译统计
Compiled:编译数量。
Failed:失败数量
Invalid:不可用数量
Time:时间
FailedType:失败类型
FailedMethod:失败的方法
work@authority-schedule-v1-fbf4cfd6d-86zhw:~$ jstat -compiler 47
Compiled Failed Invalid Time FailedType FailedMethod
14158 1 0 71.73 1 com/mysql/jdbc/AbandonedConnectionCleanupThread run
垃圾回收统计
S0C:第一个幸存区的大小
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
OC:老年代大小
OU:老年代使用大小
MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
work@authority-schedule-v1-fbf4cfd6d-86zhw:~$ jstat -gc 47
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
17024.0 17024.0 0.0 22.7 136320.0 60520.6 460416.0 88295.8 76212.0 74725.3 8392.0 8040.4 223 1.986 4 0.277 2.263
堆内存统计
NGCMN:新生代最小容量
NGCMX:新生代最大容量
NGC:当前新生代容量
S0C:第一个幸存区大小
S1C:第二个幸存区的大小
EC:伊甸园区的大小
OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:当前老年代大小
OC:当前老年代大小
MCMN:最小元数据容量
MCMX:最大元数据容量
MC:当前元数据空间大小
CCSMN:最小压缩类空间大小
CCSMX:最大压缩类空间大小
CCSC:当前压缩类空间大小
YGC:年轻代gc次数
FGC:老年代GC次数
work@authority-schedule-v1-fbf4cfd6d-86zhw:~$ jstat -gccapacity 47
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC
170368.0 170368.0 170368.0 17024.0 17024.0 136320.0 460416.0 460416.0 460416.0 460416.0 0.0 1118208.0 76212.0 0.0 1048576.0 8392.0 223 4
新生代垃圾回收统计
S0C:第一个幸存区大小
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
TT:对象在新生代存活的次数
MTT:对象在新生代存活的最大次数
DSS:期望的幸存区大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
work@authority-schedule-v1-fbf4cfd6d-86zhw:~$ jstat -gcnew 47
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
17024.0 17024.0 0.0 22.7 6 6 8512.0 136320.0 63300.2 223 1.986
新生代内存统计
NGCMN:新生代最小容量
NGCMX:新生代最大容量
NGC:当前新生代容量
S0CMX:最大幸存1区大小
S0C:当前幸存1区大小
S1CMX:最大幸存2区大小
S1C:当前幸存2区大小
ECMX:最大伊甸园区大小
EC:当前伊甸园区大小
YGC:年轻代垃圾回收次数
FGC:老年代回收次数
work@authority-schedule-v1-fbf4cfd6d-86zhw:~$ jstat -gcnewcapacity 47
NGCMN NGCMX NGC S0CMX S0C S1CMX S1C ECMX EC YGC FGC
170368.0 170368.0 170368.0 17024.0 17024.0 17024.0 17024.0 136320.0 136320.0 223 4
老年代垃圾回收统计
MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
OC:老年代大小
OU:老年代使用大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
work@authority-schedule-v1-fbf4cfd6d-86zhw:~$ jstat -gcold 47
MC MU CCSC CCSU OC OU YGC FGC FGCT GCT
76212.0 74725.3 8392.0 8040.4 460416.0 88295.8 223 4 0.277 2.263
老年代内存统计
OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:当前老年代大小
OC:老年代大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
work@authority-schedule-v1-fbf4cfd6d-86zhw:~$ jstat -gcoldcapacity 47
OGCMN OGCMX OGC OC YGC FGC FGCT GCT
460416.0 460416.0 460416.0 460416.0 223 4 0.277 2.263
元数据空间统计
MCMN:最小元数据容量
MCMX:最大元数据容量
MC:当前元数据空间大小
CCSMN:最小压缩类空间大小
CCSMX:最大压缩类空间大小
CCSC:当前压缩类空间大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
work@authority-schedule-v1-fbf4cfd6d-86zhw:~$ jstat -gcmetacapacity 47
MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC FGCT GCT
0.0 1118208.0 76212.0 0.0 1048576.0 8392.0 223 4 0.277 2.263
总结垃圾回收统计
S0:幸存1区当前使用比例
S1:幸存2区当前使用比例
E:Eden区使用比例
O:老年代使用比例
M:元数据区使用比例
CCS:压缩使用比例
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
work@authority-schedule-v1-fbf4cfd6d-86zhw:~$ jstat -gcutil 47
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.13 55.01 19.18 98.05 95.81 223 1.986 4 0.277 2.263
分析jstat输出的工具
jstat的挑战之一是您需要手动分析生成的统计信息。 正如您看到的那样,仅了解/解释一行内容将花费很长时间,这将很繁琐。 您可以使用GCeasy工具 ,该工具可以解析jstat输出并生成具有洞察力的图形和指标。
jstat局限性
它没有提供有关GC活动的丰富详细信息。 它仅提供足够的信息。 例如,从jstat您将不知道:
- 如果一次样本中报告了多个GC事件,那么我们将不知道每个GC事件的暂停时间是多少。
- 用户(即Java层),系统(即内核)和用户花费了多少时间。
- 有多少个GC线程正在工作,并占用了多少时间?
- 一个GC事件具有几个子阶段(例如初始标记,清理,备注,并发标记……)。 无法提供信息分类。
- 每个GC事件回收多少字节。
有时,jstat报告的数据也会产生误导 。
如果您想进行准确的GC分析,GC日志是更可靠的方法。
引用