本文將對JVM監控工具jstack, jconsole, jinfo, jmap, jdb, jstat進行詳細的介紹,具體內容請看下文html
Sun JDK監控和故障處理工具
|
主要做用
|
|
JVM Process Status Tool,顯示指定系統內全部的
HotSpot虛擬進程
|
jstat |
JVM Statistcs Monitoring Tool,用於手機HotSpot虛擬機各方面的運行數據
|
jinfo
|
Configuration Info for java,實時查看和調整虛擬機各項參數信息
|
jmap
|
Memory Map for Java,生成轉儲快照(通常稱爲headdump或dump文件)
|
jhat
|
JVM Heap Analysis Tool,與jmap搭配使用,分析jmap生成的轉儲快照
|
jstack
|
Stack Trace for Java,生成虛擬機當前時刻的線程快照(通常稱爲threddump或javacore文件)
|
1.jps:虛擬機進程情況工具
能夠列出正在運行的虛擬機進程,並顯示虛擬機執行主類(Main Class, main()函數所在的類)的名稱,以及這些進程的本地虛擬機的惟一ID。
jps能夠經過RMI協議查詢開啓了RMI服務的遠程虛擬機進程狀態,hostid爲RMI註冊表中註冊的主機名。默認端口爲1099。(前提是遠程服務器提供jstatd服務)
jps命令格式:
jps [-q] [-mlvV] [<hostid>]
options :
-q 只輸出LVMID,省略主類的名稱
-m 輸出虛擬機京城啓動時傳遞給主類main()函數的參數
-l 輸出主類的全名,若是京城執行的是Jar包,輸出Jar路徑
-v 輸出虛擬機進程啓動時JVM參數
jps -l
2.jstat:虛擬機統計信息監視工具
用於監視虛擬機各類運行狀態信息的命令行工具。它能夠顯示本地或遠程虛擬機進程中的類裝載、內存、垃圾收集、JIT編譯等運行數據,在沒有GUI圖形界面,只提供了純文本控制檯環境的服務器上,它將是運行期定位虛擬機性能問題的首選工具。
jstat命令行格式爲:
jstat [ options vmid [interval [s|ms] [count ] ] ] jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]] 對於命令格式中的VMID與LVMID須要特別說明一下:若是是本地虛擬機進程,VMID與LVMID是一致的,若是是遠程虛擬機進程,那VMID的格式應當是:
[protocl:] [//]lvmid[@hostname[:port]/servername]
參數interval和count表明查詢間隔和次數,若是省略這兩個參數,說明只查詢一次。架設須要每50ms查詢一次進程1366垃圾收集的情況,一共查詢2次,那命令應當是:
jstat -gc 1366 50 2
選項option表明這用戶但願查詢的虛擬機信息,主要分爲3類:類裝載、垃圾收集、和運行期編譯情況,具體選項及做用請參考描述。
options:
-class 監視類裝載、卸載數量、總空間及類裝載耗費的時間
-gc 監視java堆情況,包括Eden區、2個survivor區、老年代、永久代等的容量、已用空間、GC時間合計等信息
-gccapacity 監視內容與-gc基本相同,但輸出主要關注java堆各個區域使用到的最大和最小空間
-gcutil 監視內容與-gc基本內容,但輸出主要關注已使用空間佔總空間的百分比
-gccause 與-gcutil功能同樣,可是會額外輸出致使上一次GC產生的緣由
-gcnew 監視新生代GC的情況
-gcnewcapacity 監視內容與-gcnew 基本相同,輸出主要關注使用到的最大和最小空間
-gcold 監視老年代GC的情況
-gcoldcapacity 監視內容與-gcold基本相同,輸出主要關注使用到的最大和最小空間
-gcpermcapaciyt 輸出永久帶使用到的最大和最小空間
-complier 輸出JIT編譯器編譯過的方法、耗時等信息
-printcompilation 輸出已被JIT編譯的方法
jstat監視選項忒多,囿於篇幅限制沒法一一詳述。僅此淺析-gcutil結果。
jstat -gcutil 1366
E,表示Eden,新生代Eden區使用了21.53%的空間
S0、S1,表示兩個Survivor區Survivor0、Survivor1裏S0使用了74.81%的空間,S1爲空的
O,表示Old,老年代使用了82.78%
P,表示Permanent,永生代使用了85.78%
YGC,表示Young GC次數,新生代作了42次垃圾收集
YGCT,表示Young GC總耗時,新生代垃圾收集總耗時爲0.970秒
FGC,表示Full GC次數,全內存域作了4次垃圾收集
FGCT,表示Full GC總耗時,全內存域垃圾收集總耗時爲2.113秒
GCT,表示全部GC總耗時,全部內存域垃圾收集總耗時爲3.083秒
使用jstat工具在純文本狀態下監視虛擬機狀態的變化,確實不如VisualVM、Jprofile等可視化監視工具以圖表展示形式直觀,但jstat以其較小的資源佔用率博得衆多服務器管理員、性能測試人員的青睞。
三、jinfo:java配置信息工具
用於實時查看和調整虛擬機各項參數。使用jps命令的-v參數能夠查看虛擬機啓動時顯示指定的參數列表,但若是想知道未被顯式指定的參數,就只能利用jinfo的-flag選項進行查詢了。
固然JDK1.6或以上版本的話,使用java -XX:+PrintFlagsFinal查看參數默認值也是極好的。
jinfo命令格式:
jinfo [option] <pid>
where <option> is one of:
-flag <name> to print the value of the named VM flag
-flag [+|-]<name> to enable or disable the named VM flag
-flag <name>=<value> to set the named VM flag to the given value
下面咱們來展現下查詢CMSInitiatingOccupancyFraction參數:
jinfo -flag CMSInitiatingOccupancyFraction 1366
四、jmap:java內存快照工具
用於生成堆轉儲快照。
若是不適用jmap命令,想要獲取Java堆轉儲快照還有一些比較「暴力」的手段,譬如:
-XX:+HeapDumpOnOutOfMemoryError參數,可讓虛擬機在OOM異常出現以後自動生成dump文件
-XX:+HeapDumpOnCtrlBreak參數則可以使用[Ctrl]+[Break]鍵讓虛擬機生成dump文件
固然若是在linux系統下經過kill -3命令發送進程退出信號「恐嚇」一下虛擬機,也能拿到dump文件
jmap的做用並不只僅是爲了獲取dump文件,它還能夠查詢finalize執行隊列,java堆和永久代的詳細信息,如空間使用率、當前用的是哪一種GC收集器等。
jmap命令格式:
jmap [option] <pid>
options:
-dump 生成java堆轉儲快照
-finalizerinfo 顯示在F-Queue中等待Finalizer線程執行finalize方法的對象
-heap 顯示java堆詳細信息,如使用哪一種回收器、參數配置、分代情況等
-histo 顯示堆中對象統計信息,包括類、實例數量和合計容量
-permstat 以ClassLoader爲統計口徑顯示永久代內存狀態
-F 當虛擬機進程對-dump選項沒有響應時,可以使用這個選項生成dump快照
五、jhat:虛擬機堆轉儲快照分析工具
與jmap搭配使用,分析jmap生成的堆轉儲快照。jhat內置了一個微型http/html服務器,生成dump文件的分析結果,能夠在瀏覽器中查看。
jhat的功能並非很強大,而且在服務器上直接分析dump文件過度的消耗了硬件資源。在此推薦利用VisualVM、Eclipse Memory Analyzer、IBM HeapAnalyzer等工具。
jhat 命令格式:
jhat [-stack <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-debug <int>] [-version] [-h|-help] <file>
六、jstack:java堆棧跟蹤工具
用於生成虛擬機當前時刻的線程快照。線程快照就是當前虛擬機內每一條線程正在執行的方法堆棧計劃。
生成線程快照的主要目的是定位線程出現長時間停頓的緣由,如線程間死鎖、死循環、請求外部資源致使的長時間等待等都是致使線程長時間停頓的常見緣由。線程出現停頓的時候經過jstack來查看各個線程的調用堆棧,就能夠知道沒有響應的線程到底在後臺作些什麼事情,或者等待着什麼資源。
jstack命令格式:
jstack [option]<pid>
options:
-F 當正常輸出的請求不被響應時,強制輸出線程堆棧
-l 打印除堆棧之外關於鎖的附加信息
-m 若是調用到本地方法的話,能夠顯示C/C++的堆棧