探討過程:
jvm內存(堆內存)了解
jvm內存查看操作--筆記
IDE 改jvm內存大小 打印gc處理日志 ----jprofile內存分析工具使用和分析
一、Mac下查看已安裝的jdk版本的home目錄
/usr/libexec/java_home -V (獲得JDK的home目錄路徑)
下面的參考: https://www.cnblogs.com/curedfisher/p/12839485.html
工具在jdk的bin目錄里面是jdk自帶的
1、查看java項目jvm內存的大小
1-1:用代碼 見 https://www.cnblogs.com/kaibindirver/p/15982389.html
1-2:用 通過jps查看服務的pid,選擇要監控的jvm,執行jmap -heap pid
jps
查看虛擬機唯一id
jps -m 運行時傳入主類的參數;
jps -v 虛擬機參數; ----這個可以看到啟動時 設置的內存大小
jps -l 運行的主類全名 或者jar包名稱;
jps 運行的主類
jmap -heap 1993 -----這個我jdk8執行失敗 見 https://blog.csdn.net/claram/article/details/104628583
查看jvm內存情況
2、實時查看內存和cpu情況
jconsole就會出現一個可視化的工具框,就可以查看堆內存使用情況,cpu占有率。直接運行jconcole.exe,如下圖所示:
3、jmap它可以生成 java 程序的 dump 文件,可實現與-XX:+HeapDumpOnOutOfMemoryError相同的效果
jmap -dump:live,format=b,file=myjmapfile.hprof 19570
file=后面也可以指定文件存放的目錄
使用 JProfile 內存分析工具打開 見: https://www.cnblogs.com/kaibindirver/p/15982389.html
mat工具點這里看
4、Jstat監視虛擬機運行時的狀態信息
堆內存統計
jstat -gccapacity
- NGCMN:新生代最小容量
- NGCMX:新生代最大容量
- NGC:當前新生代容量
- S0C:第一個幸存區大小
- S1C:第二個幸存區的大小
- EC:伊甸園區的大小
- OGCMN:老年代最小容量
- OGCMX:老年代最大容量
- OGC:當前老年代大小
- OC:當前老年代大小
- MCMN:最小元數據容量
- MCMX:最大元數據容量
- MC:當前元數據空間大小
- CCSMN:最小壓縮類空間大小
- CCSMX:最大壓縮類空間大小
- CCSC:當前壓縮類空間大小
- YGC:年輕代gc次數
- FGC:老年代GC次數
垃圾回收統計 (看下是否頻繁fullGC)
- S0C:第一個幸存區的大小
- S1C:第二個幸存區的大小
- S0U:第一個幸存區的使用大小
- S1U:第二個幸存區的使用大小
- EC:伊甸園區的大小
- EU:伊甸園區的使用大小
- OC:老年代大小
- OU:老年代使用大小
- MC:方法區大小
- MU:方法區使用大小
- CCSC:壓縮類空間大小
- CCSU:壓縮類空間使用大小
- YGC:年輕代垃圾回收次數
- YGCT:年輕代垃圾回收消耗時間
- FGC:老年代垃圾回收次數
- FGCT:老年代垃圾回收消耗時間
- GCT:垃圾回收消耗總時間
其他屬性見 https://www.cnblogs.com/lizhonghua34/p/7307139.html
凡哥說 fullgc 一個小時執行1次比較合理
頻繁GC問題或內存溢出問題
一、使用jps
查看線程ID
二、使用jstat -gc 3331 250 20
查看gc情況,一般比較關注PERM區的情況,查看GC的增長情況。 -------這個不錯 可以一段時間內一直打印出內存使用情況
三、使用jstat -gccause
:額外輸出上次GC原因
四、使用jmap -dump:format=b,file=heapDump 3331
生成堆轉儲文件
五、使用jhat或者可視化工具(Eclipse Memory Analyzer 、IBM HeapAnalyzer)分析堆情況。
六、結合代碼解決內存溢出或泄露問題。
應用的GC負載過高。GC暫停時間越長,應用的吞吐量越低。
jstack 生成線程快照,定位線程長時間停頓的原因
參考: https://www.cnblogs.com/kongzhongqijing/articles/3630264.html
澤嵩大佬推薦
https://www.cnblogs.com/sxdcgaq8080/p/11089664.html
個人覺得不錯的(有空看下)
https://www.javatang.com/archives/2017/10/20/12131956.html
資料鋪墊\原理科普:
深入理解java虛擬機(全章節完整) https://blog.csdn.net/belongtocode/article/details/104234810
Jstat 是 JDK 自帶的一個輕量級小工具。全稱“Java Virtual Machine statistics monitoring tool”。Jstat 位於 java 的 bin 目錄下,主要利
用 JVM 內建的指令對 Java 應用程序的資源和性能進行實時的命令行的監控,包括了對 Heap size 和垃圾回收狀況的監控。常用命令如下:
命令 1:
jstat -class pid
例子:
jstat -class 2236
說明:類加載信息相關
命令 2:
jstat -gc pid [time]
例子:
jstat -gc 2236
說明:堆垃圾收集統計信息
命令 3:
jstat -gcutil pid例子:
jstat -gcutil 2236
說明:垃圾收集統計信息