什么是jstat
Jstat是JDK自带的一个轻量级小工具。全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。可见,Jstat是轻量级的、专门针对JVM的工具,非常适用。这个工具是纯命令行的,也就是说它没有图形界面;
<font color="red">注意:我们使用的是jstat
,jdk自带的工具里面还有一个叫做jstatd
的,它们俩的名字只差一个字母,jstatd
是用来监控jvm的创建和结束,在这点上不要混淆</font>
jstat 用法
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
看不懂?没关系,我们翻译一下
jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]
这下是不是就直观多了?还是不懂啥意思?没关系,我们介绍一下
-命令选项
就是我们要查询哪些命令,在控制台输入一下命令jstat -options
,就会打印出所有的命令选项+
这些命令选项都是啥呀,干嘛用的呢?其实啊,每个命令都有不同的用处,先看大致功能,一会在细讲哈
- class (类加载器数量和大小以及加载时间)
- compiler (JIT)
- gc (GC和堆状态)
- gccapacity (各区大小)
- gccause (最近一次GC统计和原因)
- gcnew (新区统计)
- gcnewcapacity (新区大小)
- gcold (老区统计)
- gcoldcapacity (老区大小)
<font color="red">gcpermcapacity (JDK7永久区大小)</font>
- gcmetacapacity (JDK8元数据大小)
- gcutil (GC统计汇总)
- printcompilation (HotSpot编译统计)
vmid
java进程id,也有人叫pid,一个main方法运行起来后就占用一个进程;可以用jps
命令看你有那些java进程
间隔时间/毫秒
隔多久查一次,比如:如果我们要查询类加载统计信息,每隔1秒查一次,就可以这么写:
jstat -class 2707 1000
然后他就会每隔一秒钟查一次你的类加载信息
查询次数
如果你需要没隔一秒查一次,一共查3三次,那么可以这么写
jstat -class 2707 1000 3
在命令运行后,查询三次它就会自动停止
命令选项介绍【options】
-class 打印出类加载的信息
此命令可查询类加载器数量和大小以及加载时间,在命令行输入以下字符:
jstat -class 2707
以下是命令结果介绍
- Loaded:已加载class的数量
- Bytes:已加载class所占用空间大小
- Unloaded:未加载数量
- Bytes:未加载占用空间
- Time:时间,单位 应该是秒(我猜的),不太可能是毫秒,2.2毫秒加载6700多个类太扯了;
-compiler 编译信息的数量和时间
jstat -compiler 2707
命令结果介绍
- Compiled:编译成功的数量。
- Failed:编译失败的数量
- Invalid:不可用数量
- Time:时间
- FailedType:编译失败的类型
- FailedMethod:编译失败的方法
-gc 打印堆内存使用情况 和 垃圾回收统计信息的命令
jstat -gc 2707
命令结果介绍
- S0C:第一个幸存区的大小
- S1C:第二个幸存区的大小
- S0U:第一个幸存区的已使用大小
- S1U:第二个幸存区的已使用大小
- EC:伊甸园区的大小
- EU:伊甸园区的已使用大小
- OC:老年代大小
- OU:老年代已使用大小
- MC:方法区(在java8叫做元数据)大小
- MU:方法区(在java8叫做元数据)已使用大小
- CCSC:压缩类空间大小
- CCSU:压缩类空间已使用大小
- YGC:年轻代垃圾回收次数
- YGCT:年轻代垃圾回收消耗时间
- FGC:老年代垃圾回收次数
- FGCT:老年代垃圾回收消耗时间
- GCT:垃圾回收消耗总时间
-gccapacity 打印堆内存使用情况
jstat -gccapacity 2707
命令结果介绍
- NGCMN:新生代最小容量
- NGCMX:新生代最大容量
- NGC:当前新生代容量
- S0C:第一个幸存区(from区)大小
- S1C:第二个幸存区(to区)大小
- EC:伊甸园区的大小
- OGCMN:老年代最小容量
- OGCMX:老年代最大容量
- OGC:当前老年代大小
- OC:当前老年代大小
- MCMN:最小元数据容量
- MCMX:最大元数据容量
- MC:当前元数据空间大小
- CCSMN:最小压缩类空间大小
- CCSMX:最大压缩类空间大小
- CCSC:当前压缩类空间大小
- YGC:年轻代gc次数
- FGC:老年代GC次数
-gccause 打印出导致GC的原因
jstat -gccause 2707
命令结果介绍,这里我们只关注 LGCC
和 GCC
,其他的属性可以在上面的打印出的结果找到对用属性说明,这里只介绍主要的属性说明
- LGCC:上一次GC的原因,是:分配失败;
- GCC :当前GC的原因
-gcnew 新生代垃圾回收统计
jstat -gcnew 2707
命令结果介绍
- S0C:第一个幸存区大小
- S1C:第二个幸存区的大小
- S0U:第一个幸存区的使用大小
- S1U:第二个幸存区的使用大小
- TT:对象在新生代存活的次数
- MTT:对象在新生代存活的最大次数
- DSS:期望的幸存区大小
- EC:伊甸园区的大小
- EU:伊甸园区的使用大小
- YGC:年轻代垃圾回收次数
- YGCT:年轻代垃圾回收消耗时间
-gcnewcapacity 新生代内存大小统计
jstat -gcnewcapacity 2707
命令结果说明
- NGCMN:新生代最小容量
- NGCMX:新生代最大容量
- NGC:当前新生代容量
- S0CMX:最大幸存1区大小
- S0C:当前幸存1区大小
- S1CMX:最大幸存2区大小
- S1C:当前幸存2区大小
- ECMX:最大伊甸园区大小
- EC:当前伊甸园区大小
- YGC:年轻代垃圾回收次数
- FGC:老年代回收次数
-gcold 老年代垃圾回收统计
jstat -gcold 2707
MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
OC:老年代大小
OU:老年代使用大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
-gcoldcapacity 老年代内存大小统计
jstat -gcoldcapacity 2707
命令结果介绍
OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:当前老年代大小
OC:老年代大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
-gcpermcapacity 永久代(方法区)空间统计 jdk7
方法区是JDK1.7以下才有的,在jdk1.8之后改为了元数据,但是这2者打印的信息都是一样的,因为博主这边只装了jdk1.8,所以方法区的统计就无法进行试验了,但是依然还有
-gcmetacapacity 元数据空间统计 jdk8
jstat -gcmetacapacity 2707
命令结果介绍
MCMN:最小元数据容量
MCMX:最大元数据容量
MC:当前元数据空间大小
CCSMN:最小压缩类空间大小
CCSMX:最大压缩类空间大小
CCSC:当前压缩类空间大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
-gcutil 总结垃圾回收统计
jstat -gcutil 2707
命令结果介绍
S0:幸存1区当前使用比例
S1:幸存2区当前使用比例
E:伊甸园区使用比例
O:老年代使用比例
M:元数据区使用比例
CCS:压缩使用比例
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
-printcompilation HotSpot JVM编译方法统计
jstat -printcompilation 2707
命令结果介绍
Compiled:最近编译方法的数量
Size:最近编译方法的字节码数量
Type:最近编译方法的编译类型。
Method:方法名标识
完
其实大家可以发现,打印出来的很多属性都是相同的,只会有个别不同的请情况,但还是要根据情况来打印具体的信息;