1.使用jstat命令查看堆內存的使用情況
jstat 命令選項 vmid 間隔時間 查詢次數
1.查看當前進程Class類加載的統計
jstat -class *****
2.查看編譯統計
jstat -compiler *****
3.查看垃圾回收統計
jstat -gc *****
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 ***** 1000 5 代表間隔一秒打印五次
2.通過jmap監控內存使用情況
2.1 監控堆內存:jmap -heap *****
2.2 監控內存中對象的數量及其大小:
查看所有對象的數量以及大小包括類型:jmap -histo ***** | more (| more代表分頁)
查看活躍對象的數量以及大小包括類型:jmap -histo:live ***** | more
2.3 通過jmap導出堆內存使用情況的文件,方便查看
jmap -dump:format=b,file=E:\Y2學習\JVM\導出\dump.dat 30052
2.4 通過jhat查看dump文件並且進行分析,啟動一個HTTP端口進行訪問,通過該端口可以查看到整個應用程序所使用的的所有對象的情況,提供OQL進行檢索
jhat -port 8081 E:\Y2學習\JVM\導出\dump.dat
底部有查詢工具
3.MAT分析工具,在工具中可以查看到對象數量以及內存使用的情況,當然可以分析出可能出現問題
如果問題是正常情況,可以加大內存,如果是非正常情況,手動解決代碼問題
選擇要分析的文件
查看數量及占用大小等
首行空出是搜索功能,根據正則搜索,例輸入 java 回車搜索
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,如果報錯就生成報錯文件
這樣啟動運行必然會內存溢出
找到項目的目錄,找到報錯文件
再用mat分析這個文件