深入理解Java虛擬機器(四)——JVM效能調優監控工具
Jinfo
檢視正在執行的Java應用程式的擴充套件引數
檢視jvm的引數
檢視java系統引數
Jstat
jstat命令可以檢視堆記憶體各部分的使用量,以及載入類的數量。命令的格式如下:
jstat [-命令選項] [vmid] [間隔時間/毫秒] [查詢次數]
注意:使用的jdk版本是jdk8.
類載入統計:
- Loaded:載入class的數量
- Bytes:所佔用空間大小
- Unloaded:未載入數量
- Bytes:未載入佔用空間
- Time:時間
垃圾回收統計
- S0C:第一個倖存區的大小
- S1C:第二個倖存區的大小
- S0U:第一個倖存區的使用大小
- S1U:第二個倖存區的使用大小
- EC:伊甸園區的大小
- EU:伊甸園區的使用大小
- OC:老年代大小
- OU:老年代使用大小
- MC:方法區大小(元空間)
- MU:方法區使用大小
- CCSC:壓縮類空間大小
- CCSU:壓縮類空間使用大小
- YGC:年輕代垃圾回收次數
- YGCT:年輕代垃圾回收消耗時間
- FGC:老年代垃圾回收次數
- FGCT:老年代垃圾回收消耗時間
- GCT:垃圾回收消耗總時間
堆記憶體統計
- NGCMN:新生代最小容量
- NGCMX:新生代最大容量
- NGC:當前新生代容量
- S0C:第一個倖存區大小
- S1C:第二個倖存區的大小
- EC:伊甸園區的大小
- OGCMN
- OGCMX:老年代最大容量
- OGC:當前老年代大小
- OC:當前老年代大小
- MCMN:最小元資料容量
- MCMX:最大元資料容量
- MC:當前元資料空間大小
- CCSMN:最小壓縮類空間大小
- CCSMX:最大壓縮類空間大小
- CCSC:當前壓縮類空間大小
- YGC:年輕代gc次數
- FGC:老年代GC次數
新生代垃圾回收統計
- S0C:第一個倖存區的大小
- S1C:第二個倖存區的大小
- S0U:第一個倖存區的使用大小
- S1U:第二個倖存區的使用大小
- TT:物件在新生代存活的次數
- MTT:物件在新生代存活的最大次數
- DSS:期望的倖存區大小
- EC:伊甸園區的大小
- EU:伊甸園區的使用大小
- YGC:年輕代垃圾回收次數
- YGCT:年輕代垃圾回收消耗時間
新生代記憶體統計
- NGCMN:新生代最小容量
- NGCMX:新生代最大容量
- NGC:當前新生代容量
- S0CMX:最大幸存1區大小
- S0C:當前倖存1區大小
- S1CMX:最大幸存2區大小
- S1C:當前倖存2區大小
- ECMX:最大伊甸園區大小
- EC:當前伊甸園區大小
- YGC:年輕代垃圾回收次數
- FGC:老年代回收次數
老年代垃圾回收統計
- MC:方法區大小
- MU:方法區使用大小
- CCSC:壓縮類空間大小
- CCSU:壓縮類空間使用大小
- OC:老年代大小
- OU:老年代使用大小
- YGC:年輕代垃圾回收次數
- FGC:老年代垃圾回收次數
- FGCT:老年代垃圾回收消耗時間
- GCT:垃圾回收消耗總時間
老年代記憶體統計
- OGCMN:老年代最小容量
- OGCMX:老年代最大容量
- OGC:當前老年代大小
- OC:老年代大小
- YGC:年輕代垃圾回收次數
- FGC:老年代垃圾回收次數
- FGCT:老年代垃圾回收消耗時間
- GCT:垃圾回收消耗總時間
元資料空間統計
- MCMN:最小元資料容量
- MCMX:最大元資料容量
- MC:當前元資料空間大小
- CCSMN:最小壓縮類空間大小
- CCSMX:最大壓縮類空間大小
- CCSC:當前壓縮類空間大小
- YGC:年輕代垃圾回收次數
- FGC:老年代垃圾回收次數
- FGCT:老年代垃圾回收消耗時間
- GCT:垃圾回收消耗總時間
- S0:倖存1區當前使用比例
- S1:倖存2區當前使用比例
- E:伊甸園區使用比例
- O:老年代使用比例
- M:元資料區使用比例
- CCS:壓縮使用比例
- YGC:年輕代垃圾回收次數
- FGC:老年代垃圾回收次數
- FGCT:老年代垃圾回收消耗時間
- GCT:垃圾回收消耗總時間
Jmap
此命令可以用來檢視記憶體資訊。
例項個數以及佔用記憶體大小
開啟log.txt,檔案內容如下:
- num:序號
- instances:例項數量
- bytes:佔用空間大小
- class name:類名稱
堆資訊
堆記憶體dump
也可以設定記憶體溢位自動匯出dump檔案(記憶體很大的時候,可能會導不出來)
- -XX:+HeapDumpOnOutOfMemoryError
- -XX:HeapDumpPath=./ (路徑)
可以用jvisualvm命令工具匯入該dump檔案分析
Jstack
用jstack查詢死鎖,見如下示例,也可以用jvisualvm檢視死鎖
遠端連線jvisualvm
啟動普通的jar程式JMX埠配置:
java -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar foo.jar
tomcat的JMX配置
JAVA_OPTS=-Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
jvisualvm遠端連線服務需要在遠端伺服器上配置host(連線ip 主機名),並且要關閉防火牆
jstack找出佔用cpu最高的堆疊資訊
1,使用命令top -p <pid> ,顯示你的java程序的記憶體情況,pid是你的java程序號,比如4977
2,按H,獲取每個執行緒的記憶體情況
3,找到記憶體和cpu佔用最高的執行緒tid,比如4977
4,轉為十六進位制得到 0x1371 ,此為執行緒id的十六進位制表示
5,執行 jstack 4977|grep -A 10 1371,得到執行緒堆疊資訊中1371這個執行緒所在行的後面10行
6,檢視對應的堆疊資訊找出可能存在問題的程式碼