JDK的bin目錄下面的工具都是將tool.jar進行了一層薄薄的封裝java
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,顯示虛擬機的線程快照 |
能夠列出正在運行的虛擬機進程,並顯示虛擬機執行主類(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中常見選項以下eclipse
選項 | 做用 |
---|---|
-q | 只輸出LVMID,省略主類的名稱 |
-m | 輸出虛擬機進程啓動時傳遞給主類main()函數的參數 |
-l | 輸出主類的全名,若是進程執行的是Jar包,輸出Jar路徑 |
-v | 輸出虛擬機進程啓動時JVM參數 |
jps執行樣例,運行一個以下的測試類函數
jps輸入以下參數:jps -l工具
如上圖顯示運行測試類的進程是12600,主類名稱是MonitoringTest,服務器上操做系統的ID也是12600,正好印證前面所說LVMID與PID是一致的。測試
jstat(JVM Statistics Monitoring Tool)是用於監視虛擬機各類運行狀態信息的命 令行工具。它能夠顯示本地或者遠程虛擬機進程中的類裝載、內存、垃圾收集、JIT編譯等運行數據操作系統
jstat命令格式爲:jstat [option vmid [interval[s|ms] [count]]]線程
對於命令格式中的VMID與LVMID須要特別說明一下:若是是本地虛擬機進程,VMID與LVMID是一致的,若是是遠程虛擬機進程,那VMID的格式應當是: [protocol:][//]lvmid[@hostname[:port]/servername]3d
參數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秒
jinfo(Confighration Info for Java)的做用是實時地查看和調整虛擬機各項參數 。使用jps命令的-v參數能夠查看虛擬機啓動時顯示指定的參數列表,但若是想知道未被顯示指定的參數的系統默認值,只能顯示使用jinfo的-flag選項進行查詢了。
jinfo 命令格式:jinfo [option] pid,查詢結果以下圖所示
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平臺下有效 |
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的語法對內存中的對象進行查詢統計。
jstack(Stack Trace for Java)命令用於生成虛擬機當前時刻的線程快照(通常稱 爲threaddump或者javacore文件)。線程快照就是當前虛擬機內每條線程正在執行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現長時間停頓的緣由,如線程間死鎖、死循環、請求外部資源致使的長時間等待等都是致使線程長時間停頓的常見緣由。線程出現停頓的時候經過jstack來查看各個線程的調用堆棧,就能夠知道沒有響應的線程到底在後臺等待着什麼資源
jstack命令格式:jstack [option] vmid,option選項的合法值與具體含義見下表:
選項 | 做用 |
---|---|
-F | 當正常輸出的請求不被響應時,強制輸出線程堆棧 |
-l | 除堆棧外,顯示關於鎖的附件信息 |
-m | 若是調用到本地方法的話,能夠顯示C/C++的堆棧 |
運行以下圖所示的代碼
使用jstack堆棧命令,打印下圖內容
能夠從堆棧信息中顯示MonitoringTest類中main方法線程處於runnable狀態,代碼中main方法中是一個不會退出的while循環,和堆棧中的內容相符