1 jstat(JVM Statistics Monitoring Tool)作用
监视虚拟机各种运行状态信息,可以显示本地或者是远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据
2 命令格式
jstat [options vmid [interval[count]]]
参数解释
第一个参数:options
代表用户希望查询的虚拟机信息,主要分为3类:类装载、垃圾收集和运行期编译状况,具体选项及作用如下:
- -class:显示有关类加载器行为的统计信息
- -compiler:显示有关Java HotSpot VM即时编译器行为的统计信息
- -gc:显示有关垃圾收集堆行为的统计信息
- -gccapacity:显示有关各个垃圾回收代容量及其相应空间的统计信息
- -gccause:显示有关垃圾收集统计信息(同-gcutil),以及上一次和当前(如果适用)垃圾收集事件的原因
- -gcnew:显示新生代行为的统计信息
- -gcnewcapacity:显示有关新生代大小及其相应空间的统计信息
- -gcold:显示有关老年代行为的统计信息和元空间统计信息
- -gcoldcapacity:显示有关老年代大小的统计信息
- -gcmetacapacity:显示有关元空间大小的统计信息
- -gcutil:显示有关垃圾收集统计信息
- -printcompilation:显示Java HotSpot VM编译方法统计信息
第二个参数:vmid
如果是本地虚拟机进程,vmid和本地虚拟机唯一ID是一致的
如果是远程虚拟机进程,那vmid的格式应当是:
[protocol:][//]lvmid[@hostname[:port]/servername]
第三个参数:interval
采样间隔,单位为秒(s)或毫秒(ms)
默认单位是毫秒。必须为正整数。
指定后,该jstat命令将在每个间隔产生其输出
第四个参数:count
要显示的样本数
3 案例
package com.example.demo;
import java.io.IOException;
/*
-class选项:类加载器统计信息
Loaded:已加载的类数
Bytes:加载的kB数
Unloaded:卸载的类数
Bytes:卸载的KB数
Time:执行类加载和卸载操作所花费的时间
-compiler选项:Java HotSpot VM即时编译器统计信息
Compiled:执行的编译任务数
Failed:编译任务数失败
Invalid:无效的编译任务数
Time:执行编译任务所花费的时间
FailedType:上次失败的编译的编译类型
FailedMethod:上次失败的编译的类名和方法
*/
public class jstatdemo {
public static void main(String[] args) throws IOException {
System.out.println("jstat");
System.in.read();
}
}
参数interval和count代表查询间隔和次数,如果省略这两个参数,说明只查询一次:
查询一次进程14148垃圾收集情况:
jstat –gc 14148
假设需要每250毫秒查询一次进程8888垃圾收集情况,一共查询10次,那命令应当是:
jstat –gc 8888 250 10
常见统计选项演示:
-class选项:
类加载器统计信息:
- Loaded:已加载的类数
- Bytes:加载的kB数
- Unloaded:卸载的类数
- Bytes:卸载的KB数
- Time:执行类加载和卸载操作所花费的时间
代码如下:
package com.example.demo;
import java.io.IOException;
/*
-class选项:类加载器统计信息
Loaded:已加载的类数
Bytes:加载的kB数
Unloaded:卸载的类数
Bytes:卸载的KB数
Time:执行类加载和卸载操作所花费的时间
-compiler选项:Java HotSpot VM即时编译器统计信息
Compiled:执行的编译任务数
Failed:编译任务数失败
Invalid:无效的编译任务数
Time:执行编译任务所花费的时间
FailedType:上次失败的编译的编译类型
FailedMethod:上次失败的编译的类名和方法
*/
public class jstatdemo {
public static void main(String[] args) throws IOException {
System.out.println("jstat");
System.in.read();
}
}
启动后,使用命令查看
jstat -class 14148
-compiler选项:
Java HotSpot VM即时编译器统计信息:
- Compiled:执行的编译任务数
- Failed:编译任务数失败
- Invalid:无效的编译任务数
- Time:执行编译任务所花费的时间
- FailedType:上次失败的编译的编译类型
- FailedMethod:上次失败的编译的类名和方法
代码如下:
package com.example.demo;
import java.io.IOException;
/*
-class选项:类加载器统计信息
Loaded:已加载的类数
Bytes:加载的kB数
Unloaded:卸载的类数
Bytes:卸载的KB数
Time:执行类加载和卸载操作所花费的时间
-compiler选项:Java HotSpot VM即时编译器统计信息
Compiled:执行的编译任务数
Failed:编译任务数失败
Invalid:无效的编译任务数
Time:执行编译任务所花费的时间
FailedType:上次失败的编译的编译类型
FailedMethod:上次失败的编译的类名和方法
*/
public class jstatdemo {
public static void main(String[] args) throws IOException {
System.out.println("jstat");
System.in.read();
}
}
启动后,使用命令查看
jstat -compiler 14148
-gc 选项:
垃圾收集的堆统计信息
- S0C:当前幸存者空间0容量(kB)
- S1C:当前生存空间1的容量(kB)
- S0U:幸存者空间0使用大小(kB)
- S1U:幸存者空间1使用大小(kB)
- EC:当前伊甸园空间容量(kB)
- EU:伊甸园空间使用大小(kB)
- OC:当前的老年代容量(kB)
- OU:老年代使用大小(kB)
- MC:元空间容量(kB)
- MU:元空间使用大小(kB)
- CCSC:压缩的类空间容量(kB)
- CCSU:使用的压缩类空间(kB)
- YGC:新生代垃圾收集事件的数量
- YGCT:新生代垃圾回收时间
- FGC:完整GC事件的数量
- FGCT:完整的垃圾收集时间
- GCT:总垃圾收集时间
代码如下:
package com.example.demo;
import java.io.IOException;
/*
-gc 选项:垃圾收集的堆统计信息
S0C:当前幸存者空间0容量(kB)
S1C:当前生存空间1的容量(kB)
S0U:幸存者空间0使用大小(kB)
S1U:幸存者空间1使用大小(kB)
EC:当前伊甸园空间容量(kB)
EU:伊甸园空间使用大小(kB)
OC:当前的老年代容量(kB)
OU:老年代使用大小(kB)
MC:元空间容量(kB)
MU:元空间使用大小(kB)
CCSC:压缩的类空间容量(kB)
CCSU:使用的压缩类空间(kB)
YGC:新生代垃圾收集事件的数量
YGCT:新生代垃圾回收时间
FGC:完整GC事件的数量
FGCT:完整的垃圾收集时间
GCT:总垃圾收集时间
*/
public class jstatdemo01 {
//-Xms20M -Xmx20M -Xmn10M -XX:+UseSerialGC -XX:+PrintGCDetails -verbose:gc
public static void main(String[] args) throws InterruptedException, IOException {
final int _1MB = 1024 * 1024;
byte[] b1 = new byte[2 * _1MB];
System.out.println("1...");
System.in.read();
byte[] b2 = new byte[2 * _1MB];
System.out.println("2...");
System.in.read();
byte[] b3 = new byte[2 * _1MB];
System.out.println("3...");
System.in.read();
}
}
设置JVM参数
-Xms20M -Xmx20M -Xmn10M -XX:+UseSerialGC -XX:+PrintGCDetails -verbose:gc
运行结果如下:
代码中有System.in.read();需要点击回车键才能向下运行。
运行第一段时,结果如下:
byte[] b1 = new byte[2 * _1MB];
System.out.println("1...");
System.in.read();
查看GC如下
点击回车,运行第二段代码:
byte[] b2 = new byte[2 * _1MB];
System.out.println("2...");
System.in.read();
结果如下:
点击回车,运行第三段代码:
byte[] b3 = new byte[2 * _1MB];
System.out.println("3...");
System.in.read();
查看GC,如下:
综合3次的GC来看,会发现。
第二次只增加的伊甸园区EU的数量,其他的没有变化。
第三次结果会发现幸存区、伊甸园区、新生代垃圾收集事件的数量、新生代垃圾回收时间、总垃圾收集时间被使用。
-gcutil 选项:
垃圾收集统计信息
- S0:幸存者空间0利用率占该空间当前容量的百分比
- S1:幸存者空间1利用率占空间当前容量的百分比
- E:Eden空间利用率占空间当前容量的百分比
- O:老年代利用率占空间当前容量的百分比
- M:元空间利用率占空间当前容量的百分比
- CCS:压缩的类空间利用率,以百分比表示
- YGC:新生代GC事件的数量
- YGCT:新生代垃圾回收时间
- FGC:完整GC事件的数量
- FGCT:完整的垃圾收集时间
- GCT:总垃圾收集时间
代码如下:
package cn.itcast;
import java.io.IOException;
/*
gcutil 选项:垃圾收集统计信息
S0:幸存者空间0利用率占该空间当前容量的百分比
S1:幸存者空间1利用率占空间当前容量的百分比
E:Eden空间利用率占空间当前容量的百分比
O:老年代利用率占空间当前容量的百分比
M:元空间利用率占空间当前容量的百分比
CCS:压缩的类空间利用率,以百分比表示
YGC:新生代GC事件的数量
YGCT:新生代垃圾回收时间
FGC:完整GC事件的数量
FGCT:完整的垃圾收集时间
GCT:总垃圾收集时间
*/
public class Demo03 {
//-Xms20M -Xmx20M -Xmn10M -XX:+UseSerialGC -XX:+PrintGCDetails -verbose:gc
public static void main(String[] args) throws InterruptedException, IOException {
final int _1MB = 1024 * 1024;
byte[] b1 = new byte[2 * _1MB];
System.out.println("1...");
System.in.read();
byte[] b2 = new byte[2 * _1MB];
System.out.println("2...");
System.in.read();
byte[] b3 = new byte[2 * _1MB];
System.out.println("3...");
System.in.read();
}
}
设置JVM参数
-Xms20M -Xmx20M -Xmn10M -XX:+UseSerialGC -XX:+PrintGCDetails -verbose:gc
运行后需要也需要点击三次回车
使用jstat命令,如下:
第三次老年代利用率占空间当前容量的百分比、元空间利用率占空间当前容量的百分比、压缩的类空间利用率,以百分比表示等都发生了变化。