1. 程式人生 > >讀書筆記 ---- 《深入理解Java虛擬機器》---- 第4篇:虛擬機器效能監控與故障處理工具

讀書筆記 ---- 《深入理解Java虛擬機器》---- 第4篇:虛擬機器效能監控與故障處理工具

上一篇:垃圾收集器:https://blog.csdn.net/pcwl1206/article/details/84197088

本文轉自:https://blog.csdn.net/WSYW126/article/details/62422005

第4篇:虛擬機器效能監控與故障處理工具

一  JDK的命令列工具

1  jps:虛擬機器程序狀況工具

2  jstat:虛擬機器統計資訊監視工具

3  jmap:java記憶體映像工具

4  jhat:虛擬機器堆轉儲快照分析工具

5  jstack:java堆疊跟蹤工具

7  HSDIS:JIT生成程式碼反彙編

二  JDK的視覺化工具

1  JConsole

2  VisualVM:多合一故障處理工具


本文主要講解虛擬機器效能監控與故障處理工具,主要包括兩大類:JDK的命令列工具JDK的視覺化工具。

本文只對它們的命令和功能做出介紹:

給一個系統定位問題的時候,知識、經驗是關鍵基礎,資料是依據。工具是運用知識處理資料的手段。這裡說的資料包括:執行日誌、異常堆疊、GC日誌、執行緒快照檔案(threaddump/javacore檔案)、堆轉儲快照(heapdump/hprof檔案)等。

## JDK的命令列工具
 
JDK的命令列工具大多數是對jdk/lib/tools.jar類庫的一層薄包裝而已,它們的主要功能程式碼是在tools類庫中實現的。Linux下的這些工具有的甚至是用shell指令碼編寫的。

SUN JDK監控和故障處理工具:

一  JDK的命令列工具

1  jps:虛擬機器程序狀況工具

以列出正在執行的虛擬機器程序,並顯示虛擬機器執行主類名稱以及這些程序的本地虛擬機器唯一ID。

jps命令格式: jps  [options]  [hostid]

jps可以通過RMI協議開啟了RMI服務的遠端虛擬機器程序狀態,hostid為RMI登錄檔中註冊的主機名。

jps常用的選項:

2  jstat:虛擬機器統計資訊監視工具

jstat是用於監視虛擬機器各種執行狀態資訊的命令列工具。它可以顯示本地或者遠端虛擬機器程序中的類裝載、記憶體、垃圾回收、JIT編譯等執行資料,在沒有GUI圖形介面,只是提供了純文字控制檯環境的伺服器上,它將是執行期定位虛擬機器效能問題的首選工具。

jstat的命令格式:jstat [option vmid [interval [s|ms] [count]] ]

對於命令格式中的VMID和LVMID,如過是本地虛擬機器程序,VMID和LVMID是一致的,如果是遠端虛擬機器,那VMID的格式應當是:[protocol:] [//] lvmid[@hostname[:port]/servername].

引數interval 和count分別表示查詢的間隔和次數,如果省略這兩個引數,說明只查詢一次。

3  jmap:java記憶體映像工具

jmap命令用於生成堆轉儲快照。jmap的作用並不僅僅為了獲取dump檔案,它還可以查詢finalize執行佇列、java堆和永久代的詳細資訊。如空間使用率、當前用的是哪種收集器等。

和jinfo命令一樣,jmap在windows下也受到比較大的限制。除了生成dump檔案的-dump選項和用於檢視每個類的例項、控制元件佔用統計的-histo選項在所有操作系用都提供之外,其餘選項只能在linux/solaris下使用。

jmap格式:jmap [option] vmid
 

4  jhat:虛擬機器堆轉儲快照分析工具

Sun JDK提供jhat與jmap搭配使用,來分析dump生成的堆快照。jhat內建了一個微型的HTTP/HTML伺服器,生成dump檔案的分析結果後,可以在瀏覽器中檢視。

用法舉例: jhat test1.bin

test1.bin為生成的dump檔案。

螢幕顯示“Server is ready.”的提示後,使用者在瀏覽器中鍵入http://localhost:7000就可以看到分析的結果了。

分析結果預設是以包圍單位進行分組顯示,分析記憶體洩漏問題主要會使用到其中的“Heap Histogram”與OQL標籤的功能。前者可以找到記憶體中總容量最大的物件。後者是標準的物件查詢語言,使用類似SQL的語法對記憶體中的物件進行查詢統計。

5  jstack:java堆疊跟蹤工具

jstack命令用於生成虛擬機器當前時刻的執行緒快照(一般稱為threaddump或者javacore檔案)。執行緒快照就是當前虛擬機器內每一條執行緒正在執行的方法堆疊集合,生成執行緒快照的主要目的是定位執行緒出現長時間停頓的原因,如執行緒死鎖、死迴圈、請求外部資源導致長時間等待等。

jstack 格式:jstack [option] vmid

option選項的合法值和具體含義

Tread類新增了一個getAllStackTraces()方法用於獲取虛擬機器中所有的執行緒的StackTraceElement物件。

7  HSDIS:JIT生成程式碼反彙編

在Java虛擬機器規範中,詳細描述了虛擬機器指令集中每條指令的執行過程、執行前後對運算元棧、區域性變量表的影響等細節。這些細節描述與Sun的早期虛擬機器(Sun Classic VM)高度吻合,但隨著技術的發展,高效能虛擬機器真正的細節實現方式已經漸漸與虛擬機器規範所描述的內容產生了越來越大的差距,虛擬機器規範中的描述逐漸成了虛擬機器實現的“概念模型”——即實現只能保證規範描述等效。基於這個原因,我們分析程式的執行語義問題(虛擬機器做了什麼)時,在位元組碼層面上分析完全可行,但分析程式的執行行為問題(虛擬機器是怎樣做的、效能如何)時,在位元組碼層面上分析就沒有什麼意義了,需要通過其他方式解決。

分析程式如何執行,通過軟體除錯工具(GDB、Windbg等)來斷點除錯是最常見的手段,但是這樣的除錯方式在Java虛擬機器中會遇到很大困難,因為大量執行程式碼是通過JIT編譯器動態生成到CodeBuffer中的,沒有很簡單的手段來處理這種混合模式的除錯(不過相信虛擬機器開發團隊內部肯定是有內部工具的)。因此,不得不通過一些特別的手段來解決問題,基於這種背景,本節的主角——HSDIS外掛就正式登場了。

HSDIS是一個Sun官方推薦的HotSpot虛擬機器JIT編譯程式碼的反彙編外掛,它包含在HotSpot虛擬機器的原始碼之中,但沒有提供編譯後的程式。在Project Kenai的網站也可以下載到單獨的原始碼。它的作用是讓HotSpot的-XX:+PrintAssembly指令呼叫它來把動態生成的原生代碼還原為彙編程式碼輸出,同時還生成了大量非常有價值的註釋,這樣我們就可以通過輸出的程式碼來分析問題。讀者可以根據自己的作業系統和CPU型別從Project Kenai的網站上下載編譯好的外掛,直接放到JDK_HOME/jre/bin/client和JDK_HOME/jre/bin/server目錄中即可。如果沒有找到所需作業系統(譬如Windows的就沒有)的成品,那就得自己使用原始碼編譯一下。

還需要注意的是,如果讀者使用的是Debug或者FastDebug版的HotSpot,那可以直接通過-XX:+PrintAssembly指令使用外掛;如果使用的是Product版的HotSpot,那還要額外加入一個-XX:+UnlockDiagnosticVMOptions引數。


二  JDK的視覺化工具

JDK中除了提供大量的命令列工具外,還有兩個功能強大的視覺化工具:JConsoleVisualVM

1  JConsole

JConsole工具在JDK/bin目錄下,啟動JConsole後,將自動搜尋本機執行的jvm程序,不需要jps命令來查詢指定。雙擊其中一個jvm程序即可開始監控,也可使用“遠端程序”來連線遠端伺服器。

2  VisualVM:多合一故障處理工具

VisualVM是一個整合多個JDK命令列工具的視覺化工具。VisualVM基於NetBeans平臺開發,它具備了外掛擴充套件功能的特性,通過外掛的擴充套件,可用於顯示虛擬機器程序及程序的配置和環境資訊(jps,jinfo),監視應用程式的CPU、GC、堆、方法區及執行緒的資訊(jstat、jstack)等。VisualVM在JDK/bin目錄下。

VisualVM的效能分析功能甚至比起JProfiler、YourKit等專業且收費的Profiling工具都不會遜色多少,而且VisualVM還有一個很大的優點:不需要被監視的程式基於特殊Agent執行,因此它對應用程式的實際效能的影響很小,使得它可以直接應用在生產環境中。這個優點是JProfiler、YourKit等工具無法與之媲美的。
 


上一篇:垃圾收集器:https://blog.csdn.net/pcwl1206/article/details/84197088

下一篇:類檔案結構:https://blog.csdn.net/pcwl1206/article/details/84197219