1. 程式人生 > >【深入理解 Java 虛擬機器筆記】虛擬機器效能監控與故障處理工具

【深入理解 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,主要有兩個原因:

  1. 分析工程會耗用伺服器資源
  2. 功能相對 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.