JVM命令使用演示 这篇文章里演示了一些jvm命令的使用,跟着这个主题,写了:JVM命令之jstack深入讲解 和 JVM命令之jmap深入讲解 ,今天接着这条线具体介绍一下jstat命令的使用。
作用
JVM statistics Monitoring,用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
使用
依旧先看一下使用帮助
~ ᐅ jstat -help
Usage: jstat -help|-options
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
Definitions:
<option> An option reported by the -options option
<vmid> Virtual Machine Identifier. A vmid takes the following form:
<lvmid>[@<hostname>[:<port>]]
Where <lvmid> is the local vm identifier for the target
Java virtual machine, typically a process id; <hostname> is
the name of the host running the target Java virtual machine;
and <port> is the port number for the rmiregistry on the
target host. See the jvmstat documentation for a more complete
description of the Virtual Machine Identifier.
<lines> Number of samples between header lines.
<interval> Sampling interval. The following forms are allowed:
<n>[“ms”|”s”]
Where <n> is an integer and the suffix specifies the units as
milliseconds(“ms”) or seconds(“s”). The default units are “ms”.
<count> Number of samples to take before terminating.
-J<flag> Pass <flag> directly to the runtime system.
这里首先介绍一下 jstat -<option> pid 后面跟0、1、2个参数的差别,举例说明:
~ ᐅ jps
30054 Jps
29529 Launcher
28953
29530 SearchBusiestCPU
29295 RemoteMavenServer
~ ᐅ jstat -gcutil 29530 # 0个参数的时候直接输出一次当前情况
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 20.59 0.00 17.27 19.75 0 0.000 0 0.000 0.000
~ ᐅ jstat -gcutil 29530 1000 # 1个参数时这个参数代表间隔时间,一直输出
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 20.59 0.00 17.27 19.75 0 0.000 0 0.000 0.000
0.00 0.00 20.59 0.00 17.27 19.75 0 0.000 0 0.000 0.000
0.00 0.00 20.59 0.00 17.27 19.75 0 0.000 0 0.000 0.000
0.00 0.00 20.59 0.00 17.27 19.75 0 0.000 0 0.000 0.000
^C% ~ ᐅ jstat -gcutil 29530 1000 2 # 2个参数时第一个参数参数代表间隔时间,后一个参数代表输出的总次数
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 20.59 0.00 17.27 19.75 0 0.000 0 0.000 0.000
0.00 0.00 20.59 0.00 17.27 19.75 0 0.000 0 0.000 0.000
当然也支持-t,-h<num>,直接看一下效果即可,不是特别的重要:
~ ᐅ jstat -gcutil -t -h5 29530 1000
Timestamp S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
428.5 0.00 0.00 20.59 0.00 17.27 19.75 0 0.000 0 0.000 0.000
429.5 0.00 0.00 20.59 0.00 17.27 19.75 0 0.000 0 0.000 0.000
430.5 0.00 0.00 20.59 0.00 17.27 19.75 0 0.000 0 0.000 0.000
431.5 0.00 0.00 20.59 0.00 17.27 19.75 0 0.000 0 0.000 0.000
432.5 0.00 0.00 20.59 0.00 17.27 19.75 0 0.000 0 0.000 0.000
Timestamp S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
433.5 0.00 0.00 20.59 0.00 17.27 19.75 0 0.000 0 0.000 0.000
434.5 0.00 0.00 20.59 0.00 17.27 19.75 0 0.000 0 0.000 0.000
435.5 0.00 0.00 20.59 0.00 17.27 19.75 0 0.000 0 0.000 0.000
436.5 0.00 0.00 20.59 0.00 17.27 19.75 0 0.000 0 0.000 0.000
437.5 0.00 0.00 20.59 0.00 17.27 19.75 0 0.000 0 0.000 0.000
Timestamp S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
438.5 0.00 0.00 20.59 0.00 17.27 19.75 0 0.000 0 0.000 0.000
439.5 0.00 0.00 20.59 0.00 17.27 19.75 0 0.000 0 0.000 0.000
不同参数详细解释
jstat -options
可以列出当前JVM版本支持的选项,常见的有
l class (类加载器)
l compiler (JIT)
l gc (GC堆状态)
l gccapacity (各区大小)
l gccause (最近一次GC统计和原因)
l gcnew (新区统计)
l gcnewcapacity (新区大小)
l gcold (老区统计)
l gcoldcapacity (老区大小)
l gcpermcapacity (永久区大小)
l gcutil (GC统计汇总)
l printcompilation (HotSpot编译统计)
1、jstat –class <pid> : 显示加载class的数量,及所占空间等信息。
显示列名 | 具体描述 |
Loaded | 装载的类的数量 |
Bytes | 装载类所占用的字节数 |
Unloaded | 卸载类的数量 |
Bytes | 卸载类的字节数 |
Time | 装载和卸载类所花费的时间 |
2、jstat -compiler <pid>:显示VM实时编译的数量等信息。
显示列名 | 具体描述 |
Compiled | 编译任务执行数量 |
Failed | 编译任务执行失败数量 |
Invalid | 编译任务执行失效数量 |
Time | 编译任务消耗时间 |
FailedType | 最后一个编译失败任务的类型 |
FailedMethod | 最后一个编译失败任务所在的类及方法 |
3、jstat -gc <pid>: 可以显示gc的信息,查看gc的次数,及时间。
不同的版本有一定的差别,比如jdk8之后会有MC、MU等,代表Metaspace的容量(C)和已使用空间(U),下面其他参数也有相同的问题,注意识别对应的后缀即可。
显示列名 | 具体描述 |
S0C | 年轻代中第一个survivor(幸存区)的容量 (字节) |
S1C | 年轻代中第二个survivor(幸存区)的容量 (字节) |
S0U | 年轻代中第一个survivor(幸存区)目前已使用空间 (字节) |
S1U | 年轻代中第二个survivor(幸存区)目前已使用空间 (字节) |
EC | 年轻代中Eden(伊甸园)的容量 (字节) |
EU | 年轻代中Eden(伊甸园)目前已使用空间 (字节) |
OC | Old代的容量 (字节) |
OU | Old代目前已使用空间 (字节) |
PC | Perm(持久代)的容量 (字节) |
PU | Perm(持久代)目前已使用空间 (字节) |
YGC | 从应用程序启动到采样时年轻代中gc次数 |
YGCT | 从应用程序启动到采样时年轻代中gc所用时间(s) |
FGC | 从应用程序启动到采样时old代(全gc)gc次数 |
FGCT | 从应用程序启动到采样时old代(全gc)gc所用时间(s) |
GCT | 从应用程序启动到采样时gc用的总时间(s) |
4、jstat -gccapacity <pid>:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小
显示列名 | 具体描述 |
NGCMN | 年轻代(young)中初始化(最小)的大小(字节) |
NGCMX | 年轻代(young)的最大容量 (字节) |
NGC | 年轻代(young)中当前的容量 (字节) |
S0C | 年轻代中第一个survivor(幸存区)的容量 (字节) |
S1C | 年轻代中第二个survivor(幸存区)的容量 (字节) |
EC | 年轻代中Eden(伊甸园)的容量 (字节) |
OGCMN | old代中初始化(最小)的大小 (字节) |
OGCMX | old代的最大容量(字节) |
OGC | old代当前新生成的容量 (字节) |
OC | Old代的容量 (字节) |
PGCMN | perm代中初始化(最小)的大小 (字节) |
PGCMX | perm代的最大容量 (字节) |
PGC | perm代当前新生成的容量 (字节) |
PC | Perm(持久代)的容量 (字节) |
YGC | 从应用程序启动到采样时年轻代中gc次数 |
FGC | 从应用程序启动到采样时old代(全gc)gc次数 |
5、jstat -gcutil <pid>:统计gc信息
显示列名 | 具体描述 |
S0 | 年轻代中第一个survivor(幸存区)已使用的占当前容量百分比 |
S1 | 年轻代中第二个survivor(幸存区)已使用的占当前容量百分比 |
E | 年轻代中Eden(伊甸园)已使用的占当前容量百分比 |
O | old代已使用的占当前容量百分比 |
P | perm代已使用的占当前容量百分比 |
YGC | 从应用程序启动到采样时年轻代中gc次数 |
YGCT | 从应用程序启动到采样时年轻代中gc所用时间(s) |
FGC | 从应用程序启动到采样时old代(全gc)gc次数 |
FGCT | 从应用程序启动到采样时old代(全gc)gc所用时间(s) |
GCT | 从应用程序启动到采样时gc用的总时间(s) |
6、jstat -gcnew <pid>:年轻代对象的信息。
显示列名 | 具体描述 |
S0C | 年轻代中第一个survivor(幸存区)的容量 (字节) |
S1C | 年轻代中第二个survivor(幸存区)的容量 (字节) |
S0U | 年轻代中第一个survivor(幸存区)目前已使用空间 (字节) |
S1U | 年轻代中第二个survivor(幸存区)目前已使用空间 (字节) |
TT | 持有次数限制 |
MTT | 最大持有次数限制 |
EC | 年轻代中Eden(伊甸园)的容量 (字节) |
EU | 年轻代中Eden(伊甸园)目前已使用空间 (字节) |
YGC | 从应用程序启动到采样时年轻代中gc次数 |
YGCT | 从应用程序启动到采样时年轻代中gc所用时间(s) |
7、jstat -gcnewcapacity <pid>: 年轻代对象的信息及其占用量。
显示列名 | 具体描述 |
NGCMN | 年轻代(young)中初始化(最小)的大小(字节) |
NGCMX | 年轻代(young)的最大容量 (字节) |
NGC | 年轻代(young)中当前的容量 (字节) |
S0CMX | 年轻代中第一个survivor(幸存区)的最大容量 (字节) |
S0C | 年轻代中第一个survivor(幸存区)的容量 (字节) |
S1CMX | 年轻代中第二个survivor(幸存区)的最大容量 (字节) |
S1C | 年轻代中第二个survivor(幸存区)的容量 (字节) |
ECMX | 年轻代中Eden(伊甸园)的最大容量 (字节) |
EC | 年轻代中Eden(伊甸园)的容量 (字节) |
YGC | 从应用程序启动到采样时年轻代中gc次数 |
FGC | 从应用程序启动到采样时old代(全gc)gc次数 |
8、jstat -gcold <pid>:old代对象的信息。
显示列名 | 具体描述 |
PC | Perm(持久代)的容量 (字节) |
PU | Perm(持久代)目前已使用空间 (字节) |
OC | Old代的容量 (字节) |
OU | Old代目前已使用空间 (字节) |
YGC | 从应用程序启动到采样时年轻代中gc次数 |
FGC | 从应用程序启动到采样时old代(全gc)gc次数 |
FGCT | 从应用程序启动到采样时old代(全gc)gc所用时间(s) |
GCT | 从应用程序启动到采样时gc用的总时间(s) |
9、jstat -gcoldcapacity <pid>:old代对象的信息及其占用量。
显示列名 | 具体描述 |
OGCMN | old代中初始化(最小)的大小 (字节) |
OGCMX | old代的最大容量(字节) |
OGC | old代当前新生成的容量 (字节) |
OC | Old代的容量 (字节) |
YGC | 从应用程序启动到采样时年轻代中gc次数 |
FGC | 从应用程序启动到采样时old代(全gc)gc次数 |
FGCT | 从应用程序启动到采样时old代(全gc)gc所用时间(s) |
GCT | 从应用程序启动到采样时gc用的总时间(s) |
10、jstat -gcpermcapacity<pid>: perm对象的信息及其占用量。
显示列名 | 具体描述 |
PGCMN | perm代中初始化(最小)的大小 (字节) |
PGCMX | perm代的最大容量 (字节) |
PGC | perm代当前新生成的容量 (字节) |
PC | Perm(持久代)的容量 (字节) |
YGC | 从应用程序启动到采样时年轻代中gc次数 |
FGC | 从应用程序启动到采样时old代(全gc)gc次数 |
FGCT | 从应用程序启动到采样时old代(全gc)gc所用时间(s) |
GCT | 从应用程序启动到采样时gc用的总时间(s) |
11、jstat -printcompilation <pid>:当前VM执行的信息。
显示列名 | 具体描述 |
Compiled | 编译任务的数目 |
Size | 方法生成的字节码的大小 |
Type | 编译类型 |
Method | 类名和方法名用来标识编译的方法。类名使用/做为一个命名空间分隔符。方法名是给定类中的方法。上述格式是由-XX:+PrintComplation选项进行设置的 |
关于jstat就主要介绍到这里,这个命令相对容易一些,关键是对结果的解读。这些结果也不需要刻意去背,能清楚的理解分代,找到缩写规律,自己单独看也是很容易的。