一、JDK的基本監控和故障處理工具
JDK的bin目錄下面的工具都是將tool.jar進行了一層薄薄的封裝
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,用於分析heapdump檔案,它會建立一個HTTP/HTML伺服器,讓使用者可以在瀏覽器上檢視分析結果 |
jstack | Stack Trace for Java,顯示虛擬機器的執行緒快照 |
二、JDK自帶工具介紹
1.jps:虛擬機器程式狀況工具
可以列出正在執行的虛擬機器程式,並顯示虛擬機器執行主類(Main Class,main()函式 所在的類)名稱以及這些程式的本地虛擬機器唯一ID(Local Virtual Machine Identi fier,LVMID)。對於本地虛擬機器程式來說,LVMID與作業系統的程式ID(Process Ide ntifier,PID)是一致的,使用Windows的工作管理員或者UNIX的ps命令也可以查詢到虛擬機器程式的LVMID,但如果同時啟動了多個虛擬機器程式,無法根據程式名稱來定位時,那麼只能依賴jps命令顯示主類的功能才能區分了。
jps命令格式:jps [options][hostid]
jps可以通過RMI協議查詢開啟了RMI服務的遠端虛擬機器程式狀態,hostid為RMI登錄檔中註冊的主機名。jps中常見選項如下
選項 | 作用 |
---|---|
-q | 只輸出LVMID,省略主類的名稱 |
-m | 輸出虛擬機器程式啟動時傳遞給主類main()函式的引數 |
-l | 輸出主類的全名,如果程式執行的是Jar包,輸出Jar路徑 |
-v | 輸出虛擬機器程式啟動時JVM引數 |
jps執行樣例,執行一個如下的測試類
jps輸入如下引數:jps -l
如上圖顯示執行測試類的程式是12600,主類名稱是MonitoringTest,伺服器上作業系統的ID也是12600,正好印證前面所說LVMID與PID是一致的。
2.jstat:虛擬機器統計資訊監視工具
jstat(JVM Statistics Monitoring Tool)是用於監視虛擬機器各種執行狀態資訊的命 令行工具。它可以顯示本地或者遠端虛擬機器程式中的類裝載、記憶體、垃圾收集、JIT編譯等執行資料
jstat命令格式為:jstat [option vmid [interval[s|ms] [count]]]
對於命令格式中的VMID與LVMID需要特別說明一下:如果是本地虛擬機器程式,VMID與LVMID是一致的,如果是遠端虛擬機器程式,那VMID的格式應當是: [protocol:][//]lvmid[@hostname[:port]/servername]
引數interval和count代表查詢間隔和次數,如果省略這兩個引數,說明只查詢一次。假設需要每250毫秒查詢一次程式2764垃圾收集狀況,一共查詢20次,命令應當是:jstat -gc 12600 250 20
選項option代表著使用者希望查詢的虛擬機器資訊,主要分為3類:類裝載、垃圾收集、執行期編譯狀況,具體選項及作用如下所示
選項 | 作用 |
---|---|
-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編譯的方法 |
jstat命令與輸出結果如下圖所示
查詢結果表明:這臺伺服器的新生代Eden區(E表示Eden)使用了0%的空間,兩個survivor區(s0,s1表示Surviovr0、Survivor1)裡面都是空的,老年代(O表示old區)佔用94.67%,元空間(M表示元空間)佔用65.17%,壓縮類空間大小(CCS表示壓縮類空間)佔用68.23%,發生YGC0次,FGC1000次,耗時1.758秒,總共GC耗時1.758秒
3.jinfo:Java配置資訊工具
jinfo(Confighration Info for Java)的作用是實時地檢視和調整虛擬機器各項引數 。使用jps命令的-v引數可以檢視虛擬機器啟動時顯示指定的引數列表,但如果想知道未被顯示指定的引數的系統預設值,只能顯示使用jinfo的-flag選項進行查詢了。
jinfo 命令格式:jinfo [option] pid,查詢結果如下圖所示
4.jmap:Java記憶體映像工具
jmap(Memory Map for Java)命令用於生成堆轉儲快照(一般稱為heapdump或dump 檔案)。或者,可以使用-XX:+HeapDumpOnOutOfMemoryError引數,可以讓虛擬機器在OOM異常出現之後自動生成dump檔案,通過-XX:+HeapDumpoNcTRLBreak引數則可以使用ctrl+break鍵讓虛擬機器生成dump檔案,或者在Linux系統中通過kill -3命令傳送程式退出訊號,來拿dump檔案。
jmap命令格式:jmap [option] vmid ,option選項的合法值與具體含義如下表所示
選項 | 作用 |
---|---|
-dump | 生成Java堆轉儲快照,格式為:-dump:[live,]format=b,file=,其中live子引數說明是否只dump出存活的物件 |
-finalizerinfo | 顯示在F-Queue中等待Finalizer執行緒執行finalize方法的物件。只在Linux/Solaris平臺下有效 |
-heap | 顯示Java堆詳細資訊,如使用哪種回收器,引數配置,分代情況等。只在Linux/Solaris平臺下有效 |
-histo | 顯示堆中物件的統計資訊,包括類、例項數量、合計容量 |
-permstat | 以ClassLoader為統計口徑顯示永久代記憶體狀態。只在Linux/Solaris平臺下有效 |
-F | 當虛擬機器程式對-dump選項沒有響應時,可使用這個選項強制生成dump快照。只在Linus/Solaris平臺下有效 |
5.jhat:虛擬機器堆轉儲快照分析工具
Sun JDK提供jhat(JVM Heap Analysis Tool)命令與jmap搭配使用,來分析jmap生 成的堆轉儲快照。jhat內建了一個微型的HTTP/HTML伺服器,生成dump檔案的分析結果後,可以在瀏覽器中檢視。
jhat命令使用,jhat eclipse.bin
螢幕顯示“Server is ready”的提示後,使用者在瀏覽器輸入http://localhost:7000 就可以看到分析結果,如下圖所示
分析結果預設是以包為單位進行分組顯示,分析記憶體洩漏問題主要會使用到其中的“Heap Histogram”(與jmap -histo功能一樣)與OQL頁籤的功能,前者可以找到記憶體 中總容量最大的物件,後者是標準的物件查詢語言,使用類似SQL的語法對記憶體中的物件進行查詢統計。
6.jstack:Java堆疊跟蹤工具
jstack(Stack Trace for Java)命令用於生成虛擬機器當前時刻的執行緒快照(一般稱 為threaddump或者javacore檔案)。執行緒快照就是當前虛擬機器內每條執行緒正在執行的方法堆疊的集合,生成執行緒快照的主要目的是定位執行緒出現長時間停頓的原因,如執行緒間死鎖、死迴圈、請求外部資源導致的長時間等待等都是導致執行緒長時間停頓的常見原因。執行緒出現停頓的時候通過jstack來檢視各個執行緒的呼叫堆疊,就可以知道沒有響應的執行緒到底在後臺等待著什麼資源
jstack命令格式:jstack [option] vmid,option選項的合法值與具體含義見下表:
選項 | 作用 |
---|---|
-F | 當正常輸出的請求不被響應時,強制輸出執行緒堆疊 |
-l | 除堆疊外,顯示關於鎖的附件資訊 |
-m | 如果呼叫到本地方法的話,可以顯示C/C++的堆疊 |
執行如下圖所示的程式碼
使用jstack堆疊命令,列印下圖內容
可以從堆疊資訊中顯示MonitoringTest類中main方法執行緒處於runnable狀態,程式碼中main方法中是一個不會退出的while迴圈,和堆疊中的內容相符