JVM效能監控工具(一)-jdk命令列工具
概述
當系統出bug需要定位問題的時候,知識、經驗是關鍵基礎,資料是依據,工具是運用知識處理資料的手段。這裡所說的資料包括:執行日誌,異常堆疊,GC日誌,執行緒快照(threaddump/javacore檔案),堆轉儲快照(heapdump/hprof檔案)等。使用適當的虛擬機器監控和分析工具可以加快我們分析資料、定位問題的速度。
JDK的命令列工具
JDK本身提供了很多方便的JVM效能監控工具,除了整合式的VisualVM和jConsole外,還有jps、jstack、jmap、jhat、jstat等小巧的工具。它們在JDK的bin目錄之下:
1.jps
說明
jps(JVM Process Status Tool)用來檢視JVM裡面所有程序的具體狀態, 包括程序ID,程序啟動的路徑等等。
命令格式
> jps [options] [hostid]
jps常用options如下表:
選項 | 作用 |
---|---|
-q | 只輸出LVMID,省略主類的名稱 |
-m | 輸出虛擬機器程序啟動時傳遞給主類main()函式的引數 |
-l | 輸出主類的全名,如果程序執行的是jar,輸出jar路徑 |
-v | 輸出虛擬機器程序啟動時JVM引數 |
示例
> jps -l
2.jstat
說明
jstat(JVM Statistics Monitoring Tool)是用於監控虛擬機器各種執行狀態資訊的命令列工具。它可以顯示本地或遠端虛擬機器中的類裝載、記憶體、垃圾收集、JIT編譯等執行資料。
命令格式
> jstat [option vmid [interval count]]
引數說明
- option – 選項,代表使用者希望查詢的虛擬機器資訊,主要分為3類:類裝載、垃圾收集、執行期編譯狀況。
- vmid – VM的程序號,即當前執行的java程序號
- interval – 間隔時間,單位為秒或者毫秒
- count – 列印次數,如果預設則列印無數次
jstat 常用option 如下表:
選項 | 作用 |
---|---|
-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編譯器編譯的方法 |
輸出內容含義如下:
S0 – Heap上的 Survivor space 0 區已使用空間的百分比
S1 – Heap上的 Survivor space 1 區已使用空間的百分比
E – Heap上的 Eden space 區已使用空間的百分比
O – Heap上的 Old space 區已使用空間的百分比
P – Perm space 區已使用空間的百分比
YGC – 從應用程式啟動到取樣時發生 Young GC 的次數
YGCT – 從應用程式啟動到取樣時 Young GC 所用的時間(單位秒)
FGC – 從應用程式啟動到取樣時發生 Full GC 的次數
FGCT – 從應用程式啟動到取樣時 Full GC 所用的時間(單位秒)
GCT – 從應用程式啟動到取樣時用於垃圾回收的總時間(單位秒)
示例
引數interval和count代表查詢間隔和次數,如果省略這兩個引數,說明只查詢一次。如下:
[root@localhost bin]# jstat -gcutil 25444
每500毫秒查詢一次程序25444 垃圾收集狀況,一共查詢10次,如下:
[root@localhost bin]# jstat -gcutil 25444 500 10
[root@localhost bin]# jstat -gcnewcapacity 25444
[root@localhost bin]# jstat -gcold 25444
jstat -class pid:顯示載入class的數量,及所佔空間等資訊。
[root@localhost bin]# jstat -class 25444
jstat -compiler pid:顯示VM實時編譯的數量等資訊。
[root@localhost bin]# jstat -compiler 25444
3.jinfo
說明
jinfo(Configuration Info for Java)可觀察執行中的java程式的執行環境引數:引數包括Java System屬性和JVM命令列引數;也可從core檔案裡面知道崩潰的Java應用程式的配置資訊。
命令格式
> jinfo [option] pid
示例
4.jmap
說明
jmap(Memory Map for Java)命令用於生成堆轉儲快照(一般稱為heapdump或dump檔案)。
命令格式
jmap [option] vmid
option選項如下表所示:
選項 | 作用 |
---|---|
-heap | 顯示jvm heap詳細資訊 |
-histo | 顯示jvm heap中物件統計資訊,包括類,例項數量,合計容量 |
-dump | 生成Java堆轉儲快照。格式為:-dump:[live],format=b,file=filename,其中live子引數說明是否只dump出存活的物件 |
示例
觀察到java heap的記憶體使用情況
[root@localhost bin]# jmap -heap 2083
觀察heap中所有物件的情況,包括物件數量和所佔空間大
[root@localhost bin]# jmap -histo 2083
[root@localhost bin]# jmap -histo:live 2083
dump出所有物件檔案可用於進一步分析
[root@localhost bin]# jmap -dump:format=b,file=heap.bin 2083
dump出存活的物件檔案可用於進一步分析
[root@localhost bin]# jmap -dump:live,format=b,file=heap.bin 2083
5.jstack
說明
jstack (Stack Trace for Java)命令用於生成虛擬機器當前時刻的執行緒快照(一般稱為threaddump)。執行緒快照就是當前虛擬機器內每一條執行緒正在執行的的方法堆疊的集合,生成執行緒快照的主要目的是定位執行緒出現長時間停頓的原因,如執行緒間的死鎖、死迴圈、請求外部資源導致的長時間等待 等都是導致執行緒長時間停頓的原因。
命令格式
> jstack [option] vmid
option選項如下表所示:
選項 | 作用 |
---|---|
-F | 當正常輸出的請求不被響應時,強制輸出執行緒堆疊 |
-l | 除堆疊外,顯示關於鎖的附加資訊 |
-m | 如果呼叫到本地方法的話,可以顯示C/C++的堆疊 |