本篇文章記錄一下常見的虛擬機性能監控和排查工具的做用和使用方法。java
jdk的bin目錄下有着不少exe可執行程序,咱們經常使用的就是java、javac運行和編譯命令了。可是還有不少其它用於檢測虛擬機運行狀態的命令。本章對其進行介紹,學習如何使用。這些工具體積通常很小,緣由在於其真正的實現是在jdk/lib/tools.jar中。linux
這個工具的做用是否簡單,就是用來檢測在本系統中運行的HotSpot的進程實例,通俗的說就是運行了多少個Java程序。瀏覽器
-q: 只輸出LVMID,省略主類的名稱服務器
-m: 輸出虛擬機進程啓動時傳遞給主類main的函數的參數函數
-l:輸出主類的全名,若是進行執行的是Jar包,輸出Jar路徑工具
-v: 輸出虛擬機進程啓動時JVM參數性能
這個工具用於監視虛擬機各類運行狀態信息的命令,是運行定位虛擬機性能問題的首選工具,顯示類裝載、內存、垃圾回收、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的總耗時
這個工具能夠實時查看和調整虛擬機各項參數。
這個命令就比較經常使用了,其用於生成堆的轉儲快照,通常是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
jmap生成了一個二進制的堆數據文件,這個文件咱們沒法直接使用,須要相關工具,jhat就是提供了相關功能的一個程序。其內置了一個微型的HTTP/HTML服務器,能夠在瀏覽器上查看。除非沒有其餘工具,不然通常不會直接使用這個工具。
緣由有兩個:
1.服務器資源有限,會影響程序運行
2.分析能力不夠強大,沒有其餘工具更方便
最簡單的使用方法就是jhat xx.bin,其會開啓綁定一個端口,瀏覽器直接訪問這個端口便可。
這個命令是用於生成虛擬機當前時刻的線程快照,稱爲threaddump或者是javacore文件。主要目的是用於定位線程運行狀態,分析死鎖等緣由。
-F :當正常輸出的請求不被響應時,強制輸出線程堆棧
-l: 除堆棧外,顯示關於鎖的附加信息
-m: 若是調用到本地方法的話,能夠顯示C/C++的堆棧
可視化工具就不作過多介紹,在sun公司的jdk中默認有:jconsole、jvisualvm和jmc。這些都提供了圖形界面,包含了上述命令行的功能,若是對前面的命令比較熟悉,使用起來也不會有太大的問題。