常用的虛擬機監控、檢測工具
1.前言
本篇文章記錄一下常見的虛擬機性能監控和排查工具的作用和使用方法。
2.JDK命令行工具
jdk的bin目錄下有著很多exe可執行程序,我們常用的就是java、javac運行和編譯命令了。但是還有很多其它用於檢測虛擬機運行狀態的命令。本章對其進行介紹,學習如何使用。這些工具體積一般很小,原因在於其真正的實現是在jdk/lib/tools.jar中。
2.1 jps
這個工具的作用是否簡單,就是用來檢測在本系統中運行的HotSpot的進程實例,通俗的說就是運行了多少個Java程序。
-q: 只輸出LVMID,省略主類的名稱
-m: 輸出虛擬機進程啟動時傳遞給主類main的函數的參數
-l:輸出主類的全名,如果進行執行的是Jar包,輸出Jar路徑
-v: 輸出虛擬機進程啟動時JVM參數
2.2 jstat
這個工具用於監視虛擬機各種運行狀態信息的命令,是運行定位虛擬機性能問題的首選工具,顯示類裝載、內存、垃圾回收、JIT編譯等運行數據。
jstat -gc -2764 250 20的含義就是顯示gc選項,虛擬機id是2764,每隔250毫秒運行一次,一共運行20次。
可以選option參數有:
-class: 監視類裝載、卸載數量、總空間以及類裝載所耗費的時間
-gc: 監視Java堆狀況,包括Eden、Survivor、老年代、永久代容量,使用空間,GC時間合計等信息
-gccapacity: 與-gc基本相同,但輸出主要關註堆的各個區域使用到的最大、最小空間
-gcutil: 與-gc基本相同,但輸出主要關註已使用空間占總空間的百分比
-gccause: 與-gcutil功能一樣,但是會額外輸出導致上一次GC產生的原因
-gcnew:監視新生代GC狀況
-gcnewcapacity:與-gcnew基本相同,主要關註使用到的最大、最小空間
-gcold:監視老年代的GC狀況
-gcoldcapacity:監視內容與-gcold基本相同,輸出主要關註使用到的最大、最小空間
-gcpermcapacity:輸出永久代使用到的最大、最小空間
-compiler:輸出JIT編譯器編譯過的方法、耗時等信息
-printcompilation:輸出已經被JIT編譯的方法
輸出的內容有很多,不同的JDK版本名稱也會有些許不同,但是大同小異,這裏介紹部分指標含義:
S0、S1:對應的是兩個Survivor區域
E:對應的是Eden空間
O:對應的是Old空間
P:對應的是Permanent持久代
YGC:對應Minor GC的次數
YGCT:對應Minor GC的總耗時
FGC:對應Full GC的次數
FGCT:對應Full GC的總耗時
GCT:所有GC的總耗時
2.3 jinfo
這個工具可以實時查看和調整虛擬機各項參數。
2.4 jmap
這個命令就比較常用了,其用於生成堆的轉儲快照,一般是heapdump或者dump文件。此外還有其他的方式獲得快照:-XX:+HeapDumpOnOutOfMemoryError,OOM異常時自動生成dump文件。通過-XX:+HeapDumpOnCtrlBreak參數可以使用Ctrl+Break鍵讓虛擬機生成dump文件。又或者在Linux下Kill -3發送進程退出信號,也能拿到dump文件。
jmap除了獲取dump文件,還能查下finalize執行隊列,Java堆和永久代的詳細信息。
-dump: 生成Java堆轉出快照。格式是:-dump:[live, ] format=b,file=<filename> live子參數表示是否只dump出存活的對象
-finalizerinfo:顯示Finalizer線程執行finalize方法的對象,只在linux/Solaris平臺有效
-heap:顯示堆詳細信息,如使用哪種回收器、參數配置、分代狀況等。只在Linux/Solaris平臺有效
-histo: 顯示堆中對象統計信息,包括類、實例數量、合計容量
-permstat: 以ClassLoader為統計口徑顯示永久代內存狀態,只在Linux/Solaris平臺下有效
-F :當前虛擬機進程對-dump選項沒有響應時,可以使用這個選項強制生成dump快照。只在Linux/Solaris平臺有效。
例如:jmap -dump:format=b,file=xx.bin pid
2.5 jhat
jmap生成了一個二進制的堆數據文件,這個文件我們無法直接使用,需要相關工具,jhat就是提供了相關功能的一個程序。其內置了一個微型的HTTP/HTML服務器,可以在瀏覽器上查看。除非沒有其他工具,否則一般不會直接使用這個工具。
原因有兩個:
1.服務器資源有限,會影響程序運行
2.分析能力不夠強大,沒有其他工具更方便
最簡單的使用方法就是jhat xx.bin,其會開啟綁定一個端口,瀏覽器直接訪問這個端口即可。
2.6 jstack
這個命令是用於生成虛擬機當前時刻的線程快照,稱為threaddump或者是javacore文件。主要目的是用於定位線程運行狀態,分析死鎖等原因。
-F :當正常輸出的請求不被響應時,強制輸出線程堆棧
-l: 除堆棧外,顯示關於鎖的附加信息
-m: 如果調用到本地方法的話,可以顯示C/C++的堆棧
3. 可視化工具
可視化工具就不做過多介紹,在sun公司的jdk中默認有:jconsole、jvisualvm和jmc。這些都提供了圖形界面,包含了上述命令行的功能,如果對前面的命令比較熟悉,使用起來也不會有太大的問題。
常用的虛擬機監控、檢測工具