【JVM.3】虛擬機性能監控與故障處理工具
一.概述
經過前面兩章對於虛擬機內存分配與回收技術各方面的介紹,相信讀者已經建立了一套比較完整的理論基礎。理論總是作為指導實踐的工具,能把這些執行應用到實際工作中才是我們的最終目的。接下來我們會從實踐的角度去了解虛擬機內存管理的世界。
二.JDK的命令行工具
Java開發人員肯定都知道JDK的bin目錄中的“java.exe”、“javac.exe”這兩個命令行工具,對並非所有程序員都了解JDK的bin目錄之中其他命令行程序的作用。每逢JDK更新版本時,bin目錄下命令行工具的數量和功能都會不知不覺的增加和增強。
bin目錄如下(文中使用jdk1.8)
在本章中,將主要介紹這些工具中的一部分,主要包括監視虛擬機和故障處理的工具。
Sun JDK監控和處理工具
名稱 |
主要作用 |
jps |
jvm process status tool,顯示指定系統內所有的hotspot虛擬機進程 |
jstat | jvm statistics monitoring tool,用於收集hotspot虛擬機各方面的運行數據 |
jinfo | configuration info for java,顯示虛擬機配置信息 |
jmap | memory map for java,生成虛擬機的內存轉儲快照(heapdump文件) |
jhat |
jvm heap dump browser,用於分析heapmap文件,它會建立一個http/html服務器 讓用戶可以在瀏覽器上查看分析結果 |
jstack | stack trace for java ,顯示虛擬機的線程快照 |
1. jps:虛擬機進程狀況工具(JVM Process Status)
功能:可以列出正在運行的虛擬機進程,並顯示虛擬機執行主類(Main Class, main()函數所在的類)名稱以及這些進程的本地虛擬機唯一ID(Local Virtual Machine Identifier)。
jps命令格式:jps [options] [hostid]
jps執行樣例:
jps可以通過RMI協議開啟了RMI服務的遠程虛擬機進程狀態,hostid為RMI註冊表中註冊的主機名。
jps常用的選項:
屬性 | 作用 |
-p | 只輸出LVMID,省略主類的名稱 |
-m | 輸出虛擬機進程啟動時傳遞給主類main()函數的參數 |
-l | 輸出主類的全名,如果進程執行的是jar包,輸出jar路徑 |
-v | 輸出虛擬機進程啟動時jvm參數 |
2. jstat:虛擬機統計信息監控工具(JVM Statistics Monitoring Tool)
jstat是用於監視虛擬機各種運行狀態信息的命令行工具。它可以顯示本地或者遠程虛擬機進程中的類裝載、內存、垃圾收集、JIT編譯等運行數據。
jstat的命令格式: jstat [option vmid [interval [s|ms] [count]] ]
對於命令格式中的VMID和LVMID需要特別說明一下:如過是本地虛擬機進程,VMID和LVMID是一致的,如果是遠程虛擬機,那VMID的格式應當是:
[protocol:] [//] lvmid[@hostname[:port]/servername]
參數interval 和count分別表示查詢的間隔和次數,如果省略這兩個參數,說明只查詢一次。
jstat工具主要選項:
選項 | 作用 |
-class |
監視裝載類、卸載類、總空間以及類裝載所耗費的時間 |
-gc |
監視java堆狀況,包括eden區、兩個survivor區、老年代、永久代等的容量、已用空間、GC時間合計信息 |
-gccapacity |
監視內容與-gc基本相同,但輸出主要關註java堆各個區域使用到最大、最小空間 |
-gcutil |
監視內容與-gc基本相同,但輸出主要關註已使用控件占總空間的百分比 |
-gccause |
與-gcutil功能一樣,但是會額外輸出導致上一次gc產生的原因 |
-gcnew |
監視新生代GC情況 |
-gcnewcapacity |
監視內容與-gcnew基本相同,輸出主要關註使用到的最大、最小空間 |
-gcold |
監視老年代GC情況 |
-gcoldcapacity |
監視內容與-gcold基本相同,輸出主要關註使用到的最大、最小空間 |
-gcpermcapacity | 輸出永久代使用到的最大、最小空間 |
-compiler |
輸出JIT編譯過的方法、耗時等信息 |
-printcompilation |
輸出已經被JIT編譯過的方法 |
執行樣例:
樣例結果分析:S— Survivor區、E— Eden區、O— Old區、M— Method區(或者元數據信息(metadata))、CCS— 壓縮類空間、
YGC — 從應用程序啟動到采樣時發生 Young GC 的次數
YGCT– 從應用程序啟動到采樣時 Young GC 所用的時間(單位秒)
FGC — 從應用程序啟動到采樣時發生 Full GC 的次數
FGCT– 從應用程序啟動到采樣時 Full GC 所用的時間(單位秒)
GCT — 從應用程序啟動到采樣時用於垃圾回收的總時間(單位秒)
3. jinfo:Java配置信息工具(Configuration Info for Java)
jinfo的作用是實時地查看和調整虛擬機各項參數。
使用jps命令的-v參數可以查看虛擬機啟動時顯示指定的參數列表,但如果想知道未被顯式指定的參數的系統默認值,除了去找資料以外,就得使用jinfo的-flag選項。
jinfo格式: jinfo [option] pid
執行樣例:
4. jmap:Java內存映像工具(Memory Map for Java)
jmap命令用於生成堆轉儲快照(一般稱為heapdump或dump文件)。
jmap的作用並不僅僅是為了獲取dump文件,它還可以查詢finalize執行隊列、Java堆和永久代的詳細信息,如空間使用率、當前用的是哪種收集器等。
和jinfo命令一樣,jmap在windows下也受到比較大的限制。除了生成dump文件的-dump選項和用於查看每個類的實例、控件占用統計的-histo選項在所有操作系用都提供之外,其余選項只能在linux/solaris下使用。
jmap格式: jmap [option] vmid。
主要參數選項:
選項 | 作用 |
-dump | 生成java堆轉儲快照。格式為: -dump:[live,]format=b,file=<filename>,其中live子參數說明是否只dump出存活的對象 |
-finalizerinfo | 顯示在F-Queue中等待Finalizer線程執行finalize方法的對象。只在Linux/Solaris平臺下有效 |
-heap | 顯示java堆詳細信息,如使用哪種收集器、參數配置、分代情況等,在Linux/Solaris平臺下有效 |
-histo | 顯示堆中對象統計信息,包含類、實例對象、合集容量 |
-permstat | 以ClassLoader為統計口徑顯示永久代內存狀態。只在Linux/Solaris平臺下有效 |
-F | 當虛擬機進程對-dump選項沒有相應時。可使用這個選項強制生成dump快照。只在Linux/Solaris平臺下有效 |
執行樣例:
5. jhat:虛擬機堆轉儲快照分析工具(JVM Heap Analysis Tool)
jhat命令與jmap搭配使用,來分析jmap生成的堆轉儲快照。
jhat內置了一個微型的HTTP/HTML服務器,生成dump文件的分析結果後,可以在瀏覽器中查看。
執行樣例: 生成虛擬機堆轉儲快照文件 eclipse.bin ,再jhat分析;
當出現 Server is ready時,訪問 localhost:7000 ,可以看到分析結果: ctrl+c 結束。
6. jstack:Java堆棧跟蹤工具(Stack Trace for Java)
jstack命令用於生成虛擬機當前時刻的線程快照(一般稱為threaddump 或者 javacore文件)。
線程快照就是當前虛擬機內每一條線程正在執行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現長時間停頓的原因,如線程間死鎖、死循環、請求外部資源導致的長時間等待等都是導致線程長時間停頓的常見原因。
jstack 格式: jstack [option] vmid。
option選項的合法值和具體含義:
選項 | 作用 |
-F | 當正常輸出的請求不被響應時,強制輸出線程堆棧 |
-l | 除堆棧外,顯示關於鎖的附加信息 |
-m | 如果調用到本地方法的話,可以顯示c/c++的堆棧 |
執行樣例:
三.JDK的可視化工具
JDK中除了提供大量的命令行工具外,還有兩個功能強大的可視化工具:JConsole 和 VisualVM。
1. JConsole:Java監視與管理控制臺
1.1 啟動JConsole
通過JDK/bin目錄下的“jconsole.exe”啟動JConsole後,將自動搜索出本機運行的所有虛擬機進程,不需要自己再使用jps來查詢了。如圖:
主要有6個頁簽:
沒有太多需要介紹的地方;自己啟動起來做幾個小測試吧。
2. VisualVM:多合一故障處理工具
VisualVM是到目前為止隨JDK發布的功能最強大的運行監視和故障處理程序。(官方描述“All in One”)。
VisualVM可以做到:
- 顯示虛擬機進程以及進程的配置、環境信息(jps、jinfo)。
- 監視應用程序的CPU、GC、堆、方法區以及線程的信息(jstat、jstack)。
- dump以及分析堆轉儲快照(jmap、jhat)。
- 方法級的程序運行性能分析,找出被調用最多、運行時間最長的方法。
- 離線程序快照:收集程序的運行時配置、線程dump、內存dump等信息建立一個快照,可以將快照發送開發者處進行Bug反饋。
- 其他plugins的無限可能......
啟動:通過JDK/bin目錄下的“jvisualvm.exe”啟動VisualVM。看一下界面:
詳細功能自己去摸索。在這裏講一下,VisualVM安裝插件。
本章內容更多需要自己動手執行,可以嘗試這查看正在做的項目的JVM數據。
【JVM.3】虛擬機性能監控與故障處理工具