天天看點

JVM性能監控工具1 指令行工具2 可視化工具

本文為《深入了解Java虛拟機+JVM進階特性與最佳實踐》(第二版)讀書筆記

1 指令行工具

1.1 jps

       jps (JVM Process Status Tool)顯示系統内所有的正在運作的Hotspot虛拟機程序,并顯示虛拟機執行主類名稱以及這些程序的本地虛拟機唯一ID

1.1.1 jps指令格式

jps [options] [hostid]
           

1.1.2 jps常用選項

-q 隻輸出虛拟機ID,省略主類的名稱
-m 輸出虛拟機程序啟動時傳遞給主類

main()

函數的參數
-l 輸出主類的全名,如果程序執行的是jar包,輸出jar包路徑
-v 輸出虛拟機程序啟動時JVM參數

1.2 jstat

       jstat(JVM Statistics Monitoring Tool)是用于監視虛拟機各種運作狀态資訊的指令行工具。它可以顯示本地或遠端虛拟機程序中的類裝載、記憶體、垃圾收集、JIT編譯等運作資料,在沒有GUI圖形界面,隻提供了純文字控制台環境的伺服器上,它将是運作期定位虛拟機性能問題的首選工具

1.2.1 jstat指令格式

jstat [option vmid [interval [s|ms] [count]]]
           

       對于指令格式中的VMID與LVMID需要特别說明一下:如果是本地虛拟機程序,VMID與

LVMID是一緻的,如果是遠端虛拟機程序,那VMID的格式應當是:

[protocol:][//]lvmid[@hostname[:port]/servername]
           

參數interval和count代表查詢間隔和次數,如果省略這兩個參數,說明隻查詢一次。 假設

需要每250毫秒查詢一次程序2764垃圾收集狀況,一共查詢20次,那指令應當是:

jstat -gc 9527 250 20
           

1.2.2 jstat常用選項

-class 監視類裝載、解除安裝數量、總空間以及類裝載所耗費的時間
-gc 監視Java堆狀況,包括Eden區、兩個survivor區、年老代、永久代的容量、已用空間、gc時間合計資訊
-gccapacity 監視内容與-gc基本相同,但輸出主要關注Java堆各區域使用到的最大、最小空間
-gcutil 監視内容與-gc基本相同,但輸出主要關注已使用空間占總空間的百分比
-gccause 與-gcutil功能一樣,但會額外輸出導緻上一次gc産生的原因
-compiler 輸出JIT編譯器編譯過的方法、耗時等資訊
-printcompilation 輸出已經被JIT編譯的方法

1.3 jinfo

       jinfo(Configuration Info for Java)的作用是實時的檢視和調整虛拟機各項參數。

1.3.1 jinfo指令格式

jinfo [option] pid
           

1.3.2 jinfo常用選項

-flags 檢視jvm的參數
-sysprops 檢視java系統參數
-flag +[參數名 參數值] 修改jvm參數
-v 檢視虛拟機啟動時顯式指定的參數清單

1.4 jmap

       jmap(Memory Map for Java)指令用于生成堆轉儲快照(一般稱為heapdump或dump檔案)。jmap的作用并不僅僅是為了擷取dump檔案,它還可以查詢finalize執行隊列、 Java堆和永久代的詳細資訊,如空間使用率、 目前用的是哪種收集器等。和jinfo指令一樣,jmap有不少功能在Windows平台下都是受限的,除了生成dump檔案的-dump選項和用于檢視每個類的執行個體、 空間占用統計的-histo選項在所有作業系統都提供之外,其餘選項都隻能在Linux/Solaris下使用。

1.4.1 jmap指令格式

jmap [option] vmid
           

1.4.2 jmap常用選項

-dump 生成Java堆轉存快照。格式為 :

-dump:[live, ]format=b,file=<filename>

,其中live子參數說明是否隻dump出存活的對象
-finalizerinfo 顯示在F-Queue中等待Finalizer線程執行finalize方法的對象,隻在Linux/Solaris平台下有效
-heap 顯示Java堆詳細資訊,如使用哪種回收器、參數配置、分代狀況的,隻在Linux/Solaris平台下有效
-histo 顯示堆中對象統計資訊,包括類、執行個體數量、合計容量
-permstat 以ClassLoader為統計口徑顯示永久代記憶體狀态,隻在Linux/Solaris平台下有效
-F 當虛拟機程序對-dump選項沒有響應時,可使用這個選項強制生成dump快照,隻在Linux/Solaris平台下有效

1.5 jhat

       Sun JDK提供jhat(JVM Heap Analysis Tool)指令與jmap搭配使用,來分析jmap生成的堆轉儲快照。 jhat内置了一個微型的HTTP/HTML伺服器,生成dump檔案的分析結果後,可以在浏覽器中檢視。

1.6 jstack

       jstack(Stack Trace for Java)指令用于生成虛拟機目前時刻的線程快照(一般稱為 threaddump或者javacore檔案)。 線程快照就是目前虛拟機内每一條線程正在執行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現長時間停頓的原因,如線程間死鎖、死循環、 請求外部資源導緻的長時間等待等都是導緻線程長時間停頓的常見原因。 線程出現停頓的時候通過jstack來檢視各個線程的調用堆棧,就可以知道沒有響應的線程到底在背景做些什麼事情,或者等待着什麼資源。

1.6.1 jstack指令格式

jstack [option] vmid
           

1.6.2 jstack常用選項

-F 當正常輸出的請求不被響應時,強制輸出線程堆棧
-l 除堆棧外,顯示關于鎖的附加資訊
-m 如果調用到本地方法的話,可以顯示C/C++的堆棧

2 可視化工具

2.1 JConsole

       JConsole(Java Monitoring and Management Console)是一種基于JMX的可視化監視、 管

理工具。 它管理部分的功能是針對JMX MBean進行管理,由于MBean可以使用代碼、 中間件

伺服器的管理控制台或者所有符合JMX規範的軟體進行通路。

2.2 JVisualVM

       VisualVM(All-in-One Java Troubleshooting Tool)是到目前為止随JDK釋出的功能最強大的運作監視和故障處理程式,是官方主力發展的虛拟機故障處理工具。 官方在VisualVM的軟體說明中寫上了“All-in-One”的描述字樣,預示着它除了運作監視、 故障處理外,還提供了很多其他方面的功能。 如性能分析(Profiling),VisualVM的性能分析功能甚至比起JProfiler、 YourKit等專業且收費的Profiling工具都不會遜色多少,而且VisualVM的還有一個很大的優點:不需要被監視的程式基于特殊Agent運作,是以它對應用程式的實際性能的影響很小,使得它可以直接應用在生産環境中。 這個優點是JProfiler、 YourKit等工具無法與之媲美的。

2.2.1 生成、 浏覽堆轉儲快照

       在VisualVM中生成dump檔案有兩種方式,可以執行下列任一操作:

       在“應用程式”視窗中右鍵單擊應用程式節點,然後選擇“堆Dump”。

       在“應用程式”視窗中輕按兩下應用程式節點以打開應用程式标簽,然後在“監視”标簽中單擊“堆Dump”。

       生成了dump檔案之後,應用程式頁簽将在該堆的應用程式下增加一個以[heapdump]開頭的子節點,并且在首頁簽中打開了該轉儲快照,如果需要把dump檔案儲存或發送出去,要在heapdump節點上右鍵選擇“另存為”菜單,否則當VisualVM關閉時,生成的dump檔案會被當做臨時檔案删除掉。 要打開一個已經存在的dump檔案,通過檔案菜單中的“裝入”功能,選擇硬碟上的dump檔案即可。

       從堆頁簽中的“摘要”面闆可以看到應用程式dump時的運作時參數、System.getProperties()的内容、 線程堆棧等資訊,“類”面闆則是以類為統計口徑統計類的執行個體數量、 容量資訊,“執行個體”面闆不能直接使用,因為不能确定使用者想檢視哪個類的執行個體,是以需要通過“類”面闆進入,在“類”中選擇一個關心的類後輕按兩下滑鼠,即可在“執行個體”裡面看見此類中500個執行個體的具體屬性資訊。

2.2.2 分析程式性能

       在Profiler頁簽中,VisualVM提供了程式運作期間方法級的CPU執行時間分析以及記憶體分析,做Profiling分析肯定會對程式運作性能有比較大的影響,是以一般不在生産環境中使用這項功能。

       要開始分析,先選擇“CPU”和“記憶體”按鈕中的一個,然後切換到應用程式中對程式進行操作,VisualVM會記錄到這段時間中應用程式執行過的方法。 如果是CPU分析,将會統計每個方法的執行次數、 執行耗時;如果是記憶體分析,則會統計每個方法關聯的對象數以及這些對象所占的空間。 分析結束後,點選“停止”按鈕結束監控過程。

2.2.3 BTrace動态日志跟蹤

       BTrace是一個很“有趣”的VisualVM插件,本身也是可以獨立運作的程式。 它的作用是在不停止目标程式運作的前提下,通過HotSpot虛拟機的HotSwap技術動态加入原本并不存在的調試代碼。 這項功能對實際生産中的程式很有意義:經常遇到程式出現問題,但排查錯誤的一些必要資訊,譬如方法參數、 傳回值等,在開發時并沒有列印到日志之中,以至于不得不停掉服務,通過調試增量來加入日志代碼以解決問題。 當遇到生産環境服務無法随便停止時,缺一兩句日志導緻排錯進行不下去是一件非常郁悶的事情。

       在VisualVM中安裝了BTrace插件後,在應用程式面闆中右鍵點選要調試的程式,會出現“Trace Application……”菜單,點選将進入BTrace面闆。 這個面闆裡面看起來就像一個簡單的Java程式開發環境,裡面還有一小段Java代碼。