【深入理解 Java 虛擬機器筆記】虛擬機器效能監控與故障處理工具
3.虛擬機器效能監控與故障處理工具
定位問題時,知識和經驗是關鍵基礎、資料(執行日誌、異常堆疊、GC日誌、執行緒快照、堆轉儲快照)是依據、工具是運用知識處理資料的手段。
思維導圖
JDK的命令列工具
jps: 虛擬機器程序狀況工具
jps(JVM Process Status Tool):可以列出正在執行的虛擬機器程序,並顯示虛擬機器執行的主類(Main Class,main()函式所在的類)名稱以及這些程序的本地虛擬機器唯一 ID(Local Virtual Machine Identity,LVMID)。
jps 命令格式:jps [options] [hostid]
jstat:虛擬機器統計資訊監視工具
jstat(JVM Statistics Monitoring Tool):監視虛擬機器各種執行狀態資訊,包括類裝載、記憶體、垃圾收集、JIT等;在沒有 GUI 圖形介面,是執行期間定位虛擬機器效能問題的首選工具。
jstat 命令格式:jstat [options] <vmid> [<interval> [<count>]]
,其中引數 interval 和 count 表示查詢間隔和次數。而 options 表示使用者希望查詢的虛擬機器資訊,主要分為三類:類裝載,垃圾收集,執行期編譯狀況:
在 jdk 1.8 中,關於永久代的變成:-gcmetacapacity
MCMN:最小元資料容量,MCMX:最大元資料容量,MC:當前元資料空間大小,CCSMN:最小壓縮類空間大小,CCSMX:最大壓縮類空間大小,CCSC:當前壓縮類空間大小,YGC:年輕代垃圾回收次數,FGC:老年代垃圾回收次數,FGCT:老年代垃圾回收消耗時間,GCT:垃圾回收消耗總時間。
jstat 輸出樣例:
其中 S0 和 S1 指 Survivor0 區和 Survivor1區,E 即 Eden 區,O 指老年代,M 指 MetaSpace,元資料空間,CCS 是壓縮使用比例,YGC:年輕代垃圾回收次數,FGC:老年代垃圾回收次數,FGCT:老年代垃圾回收消耗時間,GCT:垃圾回收消耗總時間。
jinfo:Java 配置資訊工具
jinfo(Configuration Info for Java):實時地檢視和調整虛擬機器各項引數。雖然 jps -v
可以檢視虛擬機器啟動時顯式指定的引數,但是無法檢視一些系統預設的引數。
jinfo 命令格式:jinfo [option] pid
執行樣例:查詢 CMSInitiatingOccupancyFraction 引數
jmap:Java 記憶體映像工具
jmap(Memory Map for Java)命令用於生成堆轉儲快照(一般稱為 heapdump 或 dump 檔案)。
其他可生成 heapdump 的方式:
- 使用引數
-XX:+HeapDumpOnOutOfMemoryError
,可以讓虛擬機器在 OOM 異常出現之後自動生成 dump 檔案 - 使用引數
-XX:+HeapDumpOnCtrlBreak
然後使用Ctrl+Break
生成 - 在 Linux 系統中使用 kill -3 傳送程序退出訊號“嚇唬”虛擬機器,讓其生成 dump 檔案
jmap 還可以查詢 finalize 執行佇列、Java 堆和永久代的詳細資訊
jmap 命令格式:jmap [options] vmid
其中 options :
jhat:虛擬機器堆轉儲快照分析工具
jhat(JVM Heap Analysis Tool)用於分析 jmap 生成的 heapdump。其內建了一個微型的 HTTP 伺服器,可以在瀏覽器檢視分析結果。
實際很少用 jhat,主要有兩個原因:
- 分析工程會耗用伺服器資源
- 功能相對 BisualVM、IBM HeapAnalyzer 較為簡陋
演示:
在瀏覽器鍵入 http://localhost:7000/
就可以看到分析結果:
jstack:Java 堆疊跟蹤工具
jstack(Stack Trace for Java)命令可以用於生成虛擬機器當前時刻的執行緒快照(一般稱為 threaddump 或 javacore 檔案)。javacore 主要目的是定位執行緒出現長時間停頓的原因,比如死鎖、死迴圈、請求外部資源響應長等。另外 JDK 1.5 後 Thread 類新增了 getAllStackTraces()
方法,可以基於此自己增加管理頁面來分析。
jstack 命令格式:jstack [options] vmid
,其 options :
樣例:
HSDIS:JIT 生成程式碼反彙編
現代虛擬機器的實現慢慢地和虛擬機器規範產生差距,如果要分析程式如果執行,最常見的就是通過軟體除錯工具(GDB、Windbg等)斷點除錯,但是對於 Java 來說,很多執行程式碼是通過 JIT 動態生成到 CodeBuffer 中的。
HSDIS 是官方推薦的 HotSpot 虛擬機器 JIT 編譯程式碼的反彙編工具,它包含在 HotSpot 虛擬機器的原始碼中,但沒有提供編譯後的程式,可以自己下載放到 JDK 的相關目錄裡。它作用是讓 HotSpot 的 -XX:+PrintAssembly
指令呼叫它來把動態生成的原生代碼還原為彙編程式碼輸出,同時還生成大量有價值的註釋。
螢幕出現如下所示內容:
JDK的視覺化工具
JConsole:Java監視與管理控制檯
JConsole(Java Monitoring and Management Console)是一種基於 JMX 的視覺化監控和管理工具,它管理部分的功能是針對 MBean 進行管理,由於 MBean 可以使用程式碼、中介軟體伺服器或者所有符合 JMX 規範的軟體進行訪問,因此這裡著重介紹 JConsole 的監控功能。
啟動 JConsole
通過 JDK/bin 目錄下的“jconsole.exe”啟動 JConsole,會自動搜尋本機所有虛擬機器程序:
雙擊選擇本地程序,進入主介面,包括“概述”、“記憶體”、“執行緒”、“類”、“VM 摘要”、“MBean”,6個頁面:
其中,概述顯示整個虛擬機器主要執行資料的概覽,包括堆記憶體使用情況,執行緒,類,CPU 使用情況,4種資訊的曲線圖。
記憶體監控
記憶體頁籤相當於視覺化的 jstat 命令,用於監視受收集器管理的虛擬機器記憶體的變化趨勢。
執行緒監控
執行緒頁籤相當於視覺化的 jstack 命令,遇到執行緒停頓時可以使用這個頁籤進行監控分析。
VisualVM:多合一故障處理工具
VIsualVM(All-in-One Java Troubleshooting Tool)是目前為止JDK釋出的功能最強調的執行監控和故障處理程式,另外還支援效能分析,它還有一個很大的優點:不需要被監視的程式基於特殊 Agent 執行,因此對應用程式的實際效能影響很小,可直接應用在生成環境中。
VisualVM 是基於 NetBeans 平臺開發,具備外掛擴充套件功能的特性,基於外掛可以做到:
- 顯示虛擬機器程序以及程序配置、環境資訊(jps、jinfo)
- 監視應用程式的 CPU、GC、堆、方法區以及執行緒的資訊(jstat、jstack)
- dump 以及分析堆轉儲快照(jmap、jhat)
- 方法級的程式執行效能分析,找出被呼叫最多執行時間最長的方法
- 離執行緒序快照(收集執行時配置、執行緒 dump、記憶體 dump 等資訊建立快照)
- 其他 plugins 的無限可能
可以自動安裝外掛(也可手工安裝):
VisualVM 功能:
- 可以生成瀏覽堆轉儲快照(摘要、類、例項標籤頁、OQL 控制檯)
- 分析程式效能(Profiler 頁籤可以錄製一段時間程式每個方法執行次數和耗時)
- BTrace 動態日誌跟蹤(不停止目標程式執行的前提下通過 HotSwap 技術動態加入除錯程式碼)
小結
本章介紹了隨 JDK 釋出的 6 個命令列工具以及 2 個視覺化的故障處理工具,靈活執行這些工具可以給問題處理帶來很多便利。
參考資料
- 周志明. 深入理解Java虛擬機器 : JVM高階特性與最佳實踐 : Understanding the JVM : advanced features and best practices[M]. 機械工業出版社, 2013.