1. 程式人生 > >08 虛擬機器效能監控及故障處理工具

08 虛擬機器效能監控及故障處理工具

《深入理解Java虛擬機器:JVM高階特性與最佳實踐(第2版)》4章 本章介紹的工具基於Windows平臺下JDK1.6 Update 21 JDK1.5需手動開啟JMX,JDK1.6預設開啟 這些工具大多是jdk/lib/tools.jar類庫的一層薄包裝

命令列工具:

1. jps(JVM Process Status Tool)

虛擬機器程序狀況工具,輸入LVMID以確定是哪個虛擬機器程序 功能單一,使用頻率最高 命令格式:
jps [options] [hostid]
選項:
例:
jps -l

2. jstat(JVM Statistics Monitoring Tool)

虛擬機器統計資訊監視工具,監視虛擬機器各種執行狀態資訊,可顯示本地或者遠端虛擬機器程序中的類裝載、記憶體、垃圾收集、JIT編譯等執行資料 無GUI圖形介面伺服器執行期定位虛擬機器效能問題的首選工具 命令格式:
jstat [option vmid [interval [s|ms] [count] ] ] interval 查詢間隔,count 查詢次數,若省略這兩個引數則只查詢一次
選項:
例:
jstat -gcutil 2764

3. jinfo(Configuration Info for Java)

Java配置資訊工具,可實時地檢視和調整虛擬機器各項引數 Windows平臺只提供最基本的-flag選項 命令格式:
jinfo [option] pid
選項:
-v:檢視虛擬機器啟動時顯式指定的引數列表 -flag:檢視未被顯式指定的引數的系統預設值,JDK1.6及以上版本可使用java -XX:+PrintFlagsFinal檢視引數預設值 -sysprops:列印虛擬機器程序的System.getProperties()內容列印,JDK1.5在Linux版提供,JDK1.6之後在Windows和Linux提供 -flag [+|-] <name>或-flag <name>=<value>,修改部分執行期可寫的虛擬機器引數
例:
jinfo -flag CMSInitiatingOccupancyFraction 1444

4. jmap(Memory Map for Java)

Java記憶體映像工具,用於生成堆轉儲快照(一般稱heapdump或dump檔案),另外也可查詢finalize執行佇列、Java堆和永久代詳細資訊,如空間使用率、當前用的是哪種收集器等 Windows平臺只提供-dump、-histo選項 獲取Java堆轉儲快照的其他“暴力”手段:
使用-XX:+HeapDumpOnOutOfMemoryError,虛擬機器在OOM異常出現之後自動生成dump檔案 使用-XX:+HeapDumpOnCtrlBreak,使用[Ctrl]+[Break]生成dump檔案 在Linux系統使用Kill -3傳送程序退出訊號“嚇唬”虛擬機器生成dump檔案
命令格式:
jmap [option] vmid
選項:
例:
jmap -dump:format=b,file=eclipse.bin 3500

5. jhat(JVM Heap Analysis Tool)

虛擬機器堆轉儲快照分析工具,與jmap搭配使用分析堆轉儲快照 分析結果可在瀏覽器中檢視,http://localhost:7000 實際工作中一般不會直接使用jhat命令分析dump檔案,原因有二:
分析工作耗時消耗硬體資源 析功能相對簡陋,VisualVM,專業用於分析dump檔案的Eclipse Memory Analyzer、IBM HeapAnalyzer等有比jhat更強大更專業的分析功能
例:
jhat eclipse.bin

6. jstack(Stack Trace for Java)

Java堆疊跟蹤工具,用於生成虛擬機器當前的執行緒快照(方法堆疊的集合,稱為threaddump或javacore檔案) 生成執行緒快照的目的:
定位執行緒出現長時間停頓的原因,主要有:等待外部資源(資料庫連線、網路資源、裝置資源等)、死迴圈、鎖等待(活鎖和死鎖)
JDK1.5 java.lang.Thread類新增getAllStackTraces()方法獲取虛擬機器中所有執行緒的StackTraceElement物件 命令格式:
jstack [option] vmid
選項:
例:
jstack -l 3500
7. HSDIS Sun官方推薦的HotSpot虛擬機器JIT編譯程式碼反彙編外掛 作用: 讓HotSpot的-XX:+PrintAssembly指令呼叫它把動態生成的原生代碼還原為彙編程式碼輸出,同時生成了大量有價值的註釋,使用者通過輸出的程式碼分析問題 安裝: 根據作業系統和CPU型別從ProjectKenai網站(http://kenai.com/projects/base-hsdis)下載已編譯好的外掛,直接放到JDK_HOME/jre/bin/client和JDK_HOME/jre/bin/server目錄中即可使用,若未找到合適版本外掛可使用原始碼編譯得到 若使用Debug或FastDebug版HotSpot,可直接通過-XX:+PrintAssembly指令使用外掛 若使用Product版HotSpot,需額外加入-XX:+UnlockDiagnosticVMOptions引數 例: java -XX:+PrintAssembly -Xcomp -XX:CompileCommand=dontinline, *Bar.sum -XX:CompileCommand=compileonly, *Bar.sum test.Bar -Xcomp:以編譯模式執行程式碼,這樣程式碼可“偷懶”不需執行足夠次數來預熱就可觸發JIT編譯 -XX:CompileCommand:讓編譯器不要內聯sum()並且只編譯sum() -XX:+PrintAssembly:輸出反彙編內容

視覺化工具:

1. JConsole

基於JMX的視覺化監視、管理工具 JDK1.5開始提供 啟動:
JDK/bin/jconsole.exe
例:
“記憶體”頁籤,相當於視覺化jstate命令,監視虛擬機器記憶體(堆和永久代)變化趨勢 “執行緒”頁籤,相當於視覺化jstack命令,分析執行緒停頓情況

2. VisualVM(All-in-One Java Troubleshooting Tool)

多合一故障處理工具 JDK1.6Update7首次釋出,目前為止隨JDK釋出的功能最強大的執行監視和故障處理程式,未來一段時間官方主力發展的虛擬機器故障處理工具 除執行監視、故障處理外,提供效能分析(Profiling)功能,效能分析功能甚至比JProfiler、YourKit等專業且收費的Profiling工具都不會遜色多少 JDK1.6之前的平臺需開啟-Dcom.sun.management.jmxremote引數才可被VisualVM管理 很大的優點:
不需被監視程式基於特殊Agent執行,故對應用程式實際效能影響很小,可直接應用在生產環境中。此優點JProfiler、YourKit等無法媲美
官網: 通過外掛擴充套件支援VisualVM可做到: 1) 顯示虛擬機器程序及程序配置、環境資訊(jps、jinfo) 2) 監視應用程式CPU、GC、堆、方法區及執行緒的資訊(jstat、jstack) 3) dump及分析堆轉儲快照(jmap、jhat) 4) 方法級程式執行效能分析,找出被呼叫最多、執行時間最長的方法 5) 離執行緒序快照:收集程式執行時配置、執行緒dump、記憶體dump等資訊建立一個快照,可將快照發送給開發者進行Bug反饋 外掛安裝方法: 1) 手工安裝(不常用),在外掛中心(http://Visualvmjava.net/pluginscenters.html)下載*.nbm包,點選“工具”→“外掛”→“已下載”,在彈出的對話方塊中指定nbm包路徑即可安裝,外掛安裝後存放在JDK_HOME/lib/visualvm/visualvm路徑下 2) 自動安裝(可找到大多數所需外掛),點選“工具”→“外掛選單”,彈出外掛頁籤,在“可用外掛”頁籤選中外掛,奠基“安裝”按鈕即可安裝 例: