监控JVM内存使用情况

1.使用jstat命令查看堆内存的使用情况
jstat 命令选项 vmid 间隔时间 查询次数

1.查看当前进程Class类加载的统计

jstat -class *****

Java 监控cpu和内存 监控jvm内存变化_堆内存


2.查看编译统计

jstat -compiler *****

Java 监控cpu和内存 监控jvm内存变化_堆内存_02


3.查看垃圾回收统计

jstat -gc *****

Java 监控cpu和内存 监控jvm内存变化_堆内存_03

S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT

13312.0 13312.0  0.0    0.0   81920.0   7537.3   217088.0    4546.5   18944.0 18467.5 2304.0 2182.4      7    0.055   6      0.151    0.206
s0c: 第一个Survivor区域大小
S1C:第二个Survivor区域的大小
S0U:第一个Survivor区域使用的大小
S1U:第二个Survivor区域使用的大小
EC:Eden区域的大小
EU:Eden区域的使用大小
OC:Old区的大小
OU:Old区使用的大小
MC:方法区大小
YGC:年轻代垃圾回收次数,YGCT: 使用时间
FGC:年老代垃圾回收次数,FGCT: 使用时间

可追加间隔时间和打印次数

jstat -gc ***** 2000 5

代表间隔二秒打印五次

Java 监控cpu和内存 监控jvm内存变化_堆内存_04


2.通过jmap监控内存使用情况

2.1 监控堆内存:

jmap -heap *****

Java 监控cpu和内存 监控jvm内存变化_Java 监控cpu和内存_05


2.2 监控内存中对象的数量及其大小:

查看所有对象的数量以及大小包括类型:jmap -histo ***** | more  (| more代表分页)

Java 监控cpu和内存 监控jvm内存变化_垃圾回收_06


查看活跃对象的数量以及大小包括类型:jmap -histo:live ***** | more(按回车显示下一个)

Java 监控cpu和内存 监控jvm内存变化_搜索_07


2.3 通过jmap导出堆内存使用情况的文件,方便查看

jmap -dump:format=b,file=G:\y2\课后内容\导出\dump.dat(文件名不要忘记写) 12780

Java 监控cpu和内存 监控jvm内存变化_垃圾回收_08


2.4 通过jhat查看dump文件并且进行分析,启动一个HTTP端口进行访问,通过该端口可以查看到整个应用程序所使用的的所有对象的情况,提供OQL进行检索

jhat -port 8081 G:\y2\课后内容\导出\dump.dat

Java 监控cpu和内存 监控jvm内存变化_垃圾回收_09

Java 监控cpu和内存 监控jvm内存变化_垃圾回收_10


  底部有查询工具

Java 监控cpu和内存 监控jvm内存变化_堆内存_11


Java 监控cpu和内存 监控jvm内存变化_堆内存_12


Java 监控cpu和内存 监控jvm内存变化_搜索_13


3.MAT分析工具,在工具中可以查看到对象数量以及内存使用的情况,当然可以分析出可能出现问题

如果问题是正常情况,可以加大内存,如果是非正常情况,手动解决代码问题

解压

Java 监控cpu和内存 监控jvm内存变化_堆内存_14


Java 监控cpu和内存 监控jvm内存变化_垃圾回收_15


Java 监控cpu和内存 监控jvm内存变化_堆内存_16


Java 监控cpu和内存 监控jvm内存变化_堆内存_17


选择要分析的文件

Java 监控cpu和内存 监控jvm内存变化_Java 监控cpu和内存_18


Java 监控cpu和内存 监控jvm内存变化_搜索_19


查看数量及占用大小等

Java 监控cpu和内存 监控jvm内存变化_垃圾回收_20


首行空出是搜索功能,根据正则搜索,例输入 java 回车搜索

Java 监控cpu和内存 监控jvm内存变化_堆内存_21


查找关联对象

Java 监控cpu和内存 监控jvm内存变化_Java 监控cpu和内存_22


4.模拟内存溢出:

public static void main(String[] args) {
       List<Object> objList=new ArrayList<>();
       for (int i=0;i<10000000;i++){
           String str="";
           for(int j=0;j<1000;j++){
               str+= UUID.randomUUID().toString();
           }
           objList.add(str);
       }
       System.out.println("添加数据成功~");
   }

参数设置:-Xms8m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError,初识空间和最大空间都给成8m,如果报错就生成报错文件

Java 监控cpu和内存 监控jvm内存变化_搜索_23


这样启动运行必然会内存溢出

Java 监控cpu和内存 监控jvm内存变化_垃圾回收_24


找到项目的目录,找到报错文件

Java 监控cpu和内存 监控jvm内存变化_搜索_25


用mat解析说明上面文件

Java 监控cpu和内存 监控jvm内存变化_搜索_26