1. 程式人生 > >深入理解Java虛擬機器(四)——JVM效能調優監控工具

深入理解Java虛擬機器(四)——JVM效能調優監控工具

Jinfo

檢視正在執行的Java應用程式的擴充套件引數

檢視jvm的引數

檢視java系統引數

Jstat

jstat命令可以檢視堆記憶體各部分的使用量,以及載入類的數量。命令的格式如下:

jstat [-命令選項] [vmid] [間隔時間/毫秒] [查詢次數]

注意:使用的jdk版本是jdk8.

類載入統計:

  1. Loaded:載入class的數量
  2. Bytes:所佔用空間大小
  3. Unloaded:未載入數量
  4. Bytes:未載入佔用空間
  5. Time:時間

垃圾回收統計

  1. S0C:第一個倖存區的大小
  2. S1C:第二個倖存區的大小
  3. S0U:第一個倖存區的使用大小
  4. S1U:第二個倖存區的使用大小
  5. EC:伊甸園區的大小
  6. EU:伊甸園區的使用大小
  7. OC:老年代大小
  8. OU:老年代使用大小
  9. MC:方法區大小(元空間)
  10. MU:方法區使用大小
  11. CCSC:壓縮類空間大小
  12. CCSU:壓縮類空間使用大小
  13. YGC:年輕代垃圾回收次數
  14. YGCT:年輕代垃圾回收消耗時間
  15. FGC:老年代垃圾回收次數
  16. FGCT:老年代垃圾回收消耗時間
  17. GCT:垃圾回收消耗總時間

堆記憶體統計

  1. NGCMN:新生代最小容量
  2. NGCMX:新生代最大容量
  3. NGC:當前新生代容量
  4. S0C:第一個倖存區大小
  5. S1C:第二個倖存區的大小
  6. EC:伊甸園區的大小
  7. OGCMN
    :老年代最小容量
  8. OGCMX:老年代最大容量
  9. OGC:當前老年代大小
  10. OC:當前老年代大小
  11. MCMN:最小元資料容量
  12. MCMX:最大元資料容量
  13. MC:當前元資料空間大小
  14. CCSMN:最小壓縮類空間大小
  15. CCSMX:最大壓縮類空間大小
  16. CCSC:當前壓縮類空間大小
  17. YGC:年輕代gc次數
  18. FGC:老年代GC次數

新生代垃圾回收統計

  1. S0C:第一個倖存區的大小
  2. S1C:第二個倖存區的大小
  3. S0U:第一個倖存區的使用大小
  4. S1U:第二個倖存區的使用大小
  5. TT:物件在新生代存活的次數
  6. MTT:物件在新生代存活的最大次數
  7. DSS:期望的倖存區大小
  8. EC:伊甸園區的大小
  9. EU:伊甸園區的使用大小
  10. YGC:年輕代垃圾回收次數
  11. YGCT:年輕代垃圾回收消耗時間

新生代記憶體統計

  1. NGCMN:新生代最小容量
  2. NGCMX:新生代最大容量
  3. NGC:當前新生代容量
  4. S0CMX:最大幸存1區大小
  5. S0C:當前倖存1區大小
  6. S1CMX:最大幸存2區大小
  7. S1C:當前倖存2區大小
  8. ECMX:最大伊甸園區大小
  9. EC:當前伊甸園區大小
  10. YGC:年輕代垃圾回收次數
  11. FGC:老年代回收次數

老年代垃圾回收統計

  1. MC:方法區大小
  2. MU:方法區使用大小
  3. CCSC:壓縮類空間大小
  4. CCSU:壓縮類空間使用大小
  5. OC:老年代大小
  6. OU:老年代使用大小
  7. YGC:年輕代垃圾回收次數
  8. FGC:老年代垃圾回收次數
  9. FGCT:老年代垃圾回收消耗時間
  10. GCT:垃圾回收消耗總時間

老年代記憶體統計

  1. OGCMN:老年代最小容量
  2. OGCMX:老年代最大容量
  3. OGC:當前老年代大小
  4. OC:老年代大小
  5. YGC:年輕代垃圾回收次數
  6. FGC:老年代垃圾回收次數
  7. FGCT:老年代垃圾回收消耗時間
  8. GCT:垃圾回收消耗總時間

元資料空間統計

  1. MCMN:最小元資料容量
  2. MCMX:最大元資料容量
  3. MC:當前元資料空間大小
  4. CCSMN:最小壓縮類空間大小
  5. CCSMX:最大壓縮類空間大小
  6. CCSC:當前壓縮類空間大小
  7. YGC:年輕代垃圾回收次數
  8. FGC:老年代垃圾回收次數
  9. FGCT:老年代垃圾回收消耗時間
  10. GCT:垃圾回收消耗總時間

  1. S0:倖存1區當前使用比例
  2. S1:倖存2區當前使用比例
  3. E:伊甸園區使用比例
  4. O:老年代使用比例
  5. M:元資料區使用比例
  6. CCS:壓縮使用比例
  7. YGC:年輕代垃圾回收次數
  8. FGC:老年代垃圾回收次數
  9. FGCT:老年代垃圾回收消耗時間
  10. GCT:垃圾回收消耗總時間

Jmap

此命令可以用來檢視記憶體資訊。

例項個數以及佔用記憶體大小

開啟log.txt,檔案內容如下:

  1. num:序號
  2. instances:例項數量
  3. bytes:佔用空間大小
  4. class name:類名稱

堆資訊

堆記憶體dump

也可以設定記憶體溢位自動匯出dump檔案(記憶體很大的時候,可能會導不出來)

  1. -XX:+HeapDumpOnOutOfMemoryError
  2. -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,檢視對應的堆疊資訊找出可能存在問題的程式碼