虛擬機性能監控與故障處理工具

一、JDK的命令行工具

1、jps

JVM Process Status Tool,顯示指定系統內所有的HotSpot虛擬機進程。JDK的很多小工具的名字都參考了Unix命令的命名方式,jps就是其中的典型。與Unix的ps命令類似,jps的功能是列出正則運行的虛擬機進程,並顯示虛擬機執行主類(Main Class,main()函數所在的類)的名稱,以及這些進程的本地虛擬機的唯一ID(LVMID,Local Virtual Machine Identifier)。

jps的功能雖然比較單一,但它卻是使用頻率最高的JDK命令行工具,因爲其他JDK工具大多需要輸入它查詢到的LVMID來確定要監控的是哪一個虛擬機進程。對於本地虛擬機進程來說說,LVMID與操作系統的進程ID(PID,Process Identifier)是一致的,使用windows的任務管理器或Unix的ps命令也可以查詢到虛擬機進程的LVMID,但如果同時啓動了多個虛擬機進程,無法根據進程名稱定位時那就只能依賴jps命令顯示主類的功能才能區分了。

jps命令格式:jps [ options ] [ hostid ]

執行樣例:

jps可以通過RMI協議查詢開啓了RMI服務的遠程虛擬機進程的狀態,hostid爲RMI註冊表中註冊的主機名。jps的其他常用選項如下表所示:

jps工具主要選項
選項 作用
-q 只輸出LVMID,省略主類的名稱
-m 輸出虛擬機進程啓動時傳遞給主類main()函數的參數
-l 輸出主類的全名,如果進程執行的是jar包,輸出jar包路徑
-v 輸出虛擬機進程啓動時JVM參數

2、jstat

jstat(JVM Statistics Monitoring Tool)是用於監視虛擬機各種運行狀態信息的命令行工具。它可以顯示本地貨遠程虛擬機進程中的類裝載、內存、垃圾收集、JIT編譯等運行數據,在沒有GUI圖形截面,只提供了純文本控制檯環境的服務器上,它將是運行期定位虛擬機性能問題的首選工具。

jstat命令格式:jstat [ options vmid [interval][s | ms] [count] ]

對於命令格式中的VMID與LVMID需要特別說明一下:如果是本地虛擬機進程,VMID和LVMID是一致的,如果是遠程虛擬機進程,那VMID的格式應當是:

[protocal:][//]vmid[@hostname[:port]/servername]

參數interval和count代表了查詢間隔和次數,如果省略這兩個參數,說明只查詢一次。假設需要每250毫秒查詢一次進程2764垃圾收集狀況,一共查詢20次,那麼明亮應當是:

jstat -gc 2764 250 20

執行樣例:

查詢結果表明:新生代Eden區(E,表示Eden)使用了94.06%的空間,兩個Survivor區(S0、S1,表示Survivor0、Survivor1)裏面都是空的,老年代(O,表示Old)也是空的,永久代(P,表示Permanent)則使用率61.85%的空間。程序運行以來共發生Minor GC(YGC,表示Young GC)0次,總耗時0秒,發生Full GC(FGC,表示Full GC)0次,Full GC總耗時(FGCT,表示Full GC Time)爲0秒,所有GC總耗時(GCT,表示GC Time)爲0秒。

選項option代表着用戶希望查詢的虛擬機信息,主要分爲3類:類裝載、垃圾收集和運行期編譯狀況,具體選項及作用參考下表:

jstat工具主要選項
選項 作用
-class 監視類裝載、卸載數量、總空間及類裝載所耗費的時間
-gc 監視Java堆狀況,包括Eden區、2個survivor區、老年代、永久代等的容量、已用空間、GC時間合計等信息
-gccapacity 監視內容與-gc基本相同,但輸出主要關注Java堆各個區域使用到的最大和最新空間
-gcutil 監視內容與-gc基本相同,但輸出主要關注已使用空間佔總空間的百分比
-gccause 監視內容與-gc基本相同,但會額外輸出導致上一次GC產生的原因
-gcnew 監視新生代GC狀況
-gcnewcapacity 監視內容與-gcnew基本相同,輸出主要關注使用到的最大和最小空間
-gcold 監視老年代GC的狀況
-gcoldcapacity 監視內容與-gcold基本相同,輸出主要關注使用到的最大和最小空間
-gcpermcapacity 輸出永久代使用到的最大和最小空間
-compiler 輸出JIT編譯期編譯過的方法、耗時等信息
-printcomplilation 輸出已經被JIT編譯的方法

3、jinfo

jinfo(Configuration Info for Java)的作用是實時地查看和調整虛擬機的各項參數。使用jps命令的-v參數可以查看虛擬機啓動時顯式指定的參數列表,但如果想知道未被顯式指定的參數的系統默認值,除了去找資料外,就只能使用jinfo的-flag選項進行查詢了(如果只限於JDK1.6或以上版本的話,使用java -XX:+PrintFlasFinal查看參數默認值也是一個很好的選擇),jinfo還可以使用-sysprops選項把虛擬機進程的System.getProperties()的內容打印出來。這個命令在JDK1.5時期已經隨着Linux版JDK發佈,當時只提供了信息查詢的功能,JDK1.6之後,jinfo在Windows和Linux平臺都有提供,並且加入了運行期修改參數的能力,可以使用-flag [+-] name或-flag name=value修改一部分運行期可寫的虛擬機參數值。JDK1.6中,jinfo對於Windows平臺的功能仍然有較大的限制,只提供了最基本的-flag選項。

jinfo命令格式:jinfo [ option ] pid

執行樣例:

jstat工具主要選項選項作用-class監視類裝載、卸載數量、總空間及類裝載所耗費的時間-gc監視Java堆狀況,包括Eden區、2個survivor區、老年代、永久代等的容量、已用空間、GC時間合計等信息-gccapacity監視內容與-gc基本相同,但輸出主要關注Java堆各個區域使用到的最大和最新空間-gcutil監視內容與-gc基本相同,但輸出主要關注已使用空間佔總空間的百分比-gccause監視內容與-gc基本相同,但會額外輸出導致上一次GC產生的原因-gcnew監視新生代GC狀況-gcnewcapacity監視內容與-gcnew基本相同,輸出主要關注使用到的最大和最小空間-gcold監視老年代GC的狀況-gcoldcapacity監視內容與-gcold基本相同,輸出主要關注使用到的最大和最小空間-gcpermcapacity輸出永久代使用到的最大和最小空間-compiler輸出JIT編譯期編譯過的方法、耗時等信息-printcomplilation輸出已經被JIT編譯的方法

4、jmap

jmap(Memory Map for Java)命令用於生成堆轉儲快照(一般稱爲heapdump或dump文件)。如果不適用jmap命令,要想獲取Java堆轉儲快照還有一些比較“暴力”的手段:譬如使用--XX:+HeapDumpOnOutOfMemoryError參數,可以讓虛擬機在OOM異常出現之後自動生成dump文件,通過-XXHeapDumpOnCtrlBreak參數則可以使用Ctrl+Break鍵讓虛擬機生成dump文件,又或者在Linux系統下通過Kill -3命令發送進程退出信號“恐嚇”一下虛擬機,也能拿到dump文件。

jmap的作用並不僅僅是爲了獲取dump文件,它hia可以查詢finalize執行隊列,Java堆和永久代的詳細信息,如空間使用率、當前用的是哪種收集器等。

和jinfo命令一樣,jmap有不少功能在Windows平臺下都是受限的,除了生成dump文件的-dump選項和用於查看每個類的實例、空間佔用統計的-histo選項所有操作系統都提供之外,其餘選項都只能在Linux/Solaris下使用。

jmap命令格式:jmap [option] vmid

option選項的合法值與具體含義如下表:

發佈了40 篇原創文章 · 獲贊 6 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章