JDK 自带了很多常用工具方面我们进行一些性能监控与调试
在Windows工具都在我们JDK的bin目标下,Linux依旧有相关的命令
jps [options] [hostid]
[options]:
-q:显示进程ID
-m:显示进程ID、主类名称、传入Main方法的命令行参数
-l:显示进程ID、主类全限定名(快速得知是什么项目)
-v:显示进程ID、主类名称、JVM参数
-V:显示进程ID、主类名称 (-V 等价于 默认不加options 的 jps)
options之间可以任意组合
[hostid]
hostname:port 例如:127.0.0.1:8080
jstat [options] [vmid] [interval] [count]
[options] 可以通过jstat -options 查看所有的options
-class:显示类加载的统计信息
-compiler:Java HotSpot VM 及时编译器统计信息
-gc:显示有关垃圾收集堆行为的统计信息
-gcutil:显示有关垃圾收集堆行为的统计信息的百分比
....
-class
[vmid]
虚拟机进程ID (可通过jps -l获得) 如果远程的虚拟机就需要 进程ID@IP:端口
[interval](可不穿,但是如果传递了count,建议传递采样间隔!)
采样间隔(默认单位是毫秒),单位可选秒或者毫秒(需要手动添加单位 如 30s就是30秒,300ms就是300毫秒)
[count](可不穿)
采样一共循环的次数
Loaded 类加载数、Bytes 加载的Kb数、Unloaded卸载类数、Bytes 卸载的Kb数、Time 执行类加载和卸载操作的时间
Compiled 执行编译的任务数、Failed 编译失败任务数、Invaild 无效的编译任务数、Time 执行的时间、FailedType 上次失败的编译类型、FailedMethod 上次失败的编译类名与方法
S0C与S1C分别是幸存区0与1的内存总容量、S0U与S1U 分别是幸存区0与1的内存使用情况、EC与EU表示eden区内存总容量与使用、OC与OU表示老年代总用量与使用情况、MC与MU表示原空间总用量与使用情况、CCSC与CCSU:压缩类空间容量,类压缩空间的使用情况、YGC与YGCT表示Young GC执行次数与与时间、FGC与FGCT:Full GC执行的次数与时间、GCT:总垃圾收集时间
S0与S1表示幸存区0与1内存使用占比、E与O与M依次表示Eden与老年代与元空间的内存使用占比、CCS表示类空间压缩使用内存占比、 YGC与YGCT表示Young GC执行次数与与时间、 FGC与FGCT:Full GC执行的次数与时间、GCT:总垃圾收集时间
//-Xms20M -Xmx20M -Xmn10M -XX:+UseSerialGC -XX:+PrintGCDetails -verbose:gc
public static void main(String[] args) throws IOException {
final int OneMB = 1024*1024;
Byte[] b1 = new Byte[2*OneMB];
System.out.println("JVM 已经使用2M 回车执行下一步");
System.in.read();
Byte[] b2= new Byte[2*OneMB];
System.out.println("JVM 已经使用4M 回车继续执行下一步");
System.in.read();
Byte[] b3= new Byte[2*OneMB];
System.out.println("JVM 已经使用6M 再次回车结束");
System.in.read();
}
下面是运行结果:
jstat -gc PID
# 查看GC使用百分比
jstat -gcutil PID
这是我使用Idea插件 VisualGC 记录的,放在这里方便理解jstat的使用
我们从图中可以清晰看出来,在b3 数组 new 出来之前,内存已经不容许new 出来之后的,所以 JVM 执行了一次GC。
特殊说明: 解决问题的光鲜,藏着磕Bug的痛苦。 万物皆入轮回,谁也躲不掉! 以上文章,均是我实际操作,写出来的笔记资料,不会出现全文盗用别人文章!烦请各位,请勿直接盗用!