1. 程式人生 > >深入理解JVM虛擬機器(三):虛擬機器效能監控工具

深入理解JVM虛擬機器(三):虛擬機器效能監控工具

本部落格將講解Java虛擬機器效能監控工具的使用以及對Java虛擬機器進行效能監控的實驗。Java開發人員需要對虛擬機器效能監控工具的使用進行掌握,這是很有必要的。

1.概述

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

2.JDK的命令列工具

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

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

名稱 主要作用
jps jvm process status tool,顯示指定系統內所有的hotspot虛擬機器程序
jstat jvm statistics monitoring tool,用於收集hotspot虛擬機器各方面的執行資料
jinfo configuration info for java,顯示虛擬機器配置資訊
jmap memory map for java,生成虛擬機器的記憶體轉儲快照(heapdump檔案)
jhat jvm heap dump browser,用於分析heapmap檔案,它會建立一個http/html伺服器讓使用者可以在瀏覽器上檢視分析結果
jstack stack trace for java ,顯示虛擬機器的執行緒快照

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

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

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

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

jps常用的選項

屬性 作用
-p 只輸出LVMID,省略主類的名稱
-m 輸出虛擬機器程序啟動時傳遞給主類main()函式的引數
-l 輸出主類的全名,如果程序執行的是jar包,輸出jar路徑
-v 輸出虛擬機器程序啟動時jvm引數

輸入命令 jps

在這裡插入圖片描述

2.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分別表示查詢的間隔和次數,如果省略這兩個引數,說明只查詢一次。

屬性 作用
-class 監視裝載類、解除安裝類、總空間以及類裝載所耗費的時間
-gc 監視java堆狀況,包括eden區、兩個survivor區、老年代、永久代等的容量、已用空間、GC時間合計資訊
-gccapacity 輸出主類的全名,如果程序執行的是jar包,輸出jar路徑
-gcutil 監視內容與-gc基本相同,但輸出主要關注java堆各個區域使用到最大、最小空間
-gccause 監視內容與-gc基本相同,但輸出主要關注已使用控制元件佔總空間的百分比
-gcnew 與-gcutil功能一樣,但是會額外輸出導致上一次gc產生的原因
-gcnewcapacity 監視內容與-gcnew基本相同,輸出主要關注使用到的最大、最小空間
-gcold 監視老年代GC情況
-gcoldcapacity 監視內容與-gcold基本相同,輸出主要關注使用到的最大、最小空間
-gcpermcapacity 輸出永久代使用到的最大、最小空間
-compiler 輸出JIT編譯過的方法、耗時等資訊
-printcompilation 輸出已經被JIT編譯過的方法

監視程序虛擬機器ID39312 的java堆情況

輸入命令 jstat -gc 39312

在這裡插入圖片描述

2.3 jinfo Java配置資訊工具

jinfo的作用是實時地檢視和調整虛擬機器各項引數。
jinfo的命名格式:
jinfo [ option ] pid

輸入命令 jinfo 39312

在這裡插入圖片描述

2.4 jmap:java記憶體映像工具

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

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

jmap格式 jmap [option] vmid

選項 作用
-dump 生成java堆轉儲快照。格式為: -dump:[live,]format=b,file=,其中live子引數說明是否只dump出存活的物件
-finalizerinfo 顯示在F-Queue中等待Finalizer執行緒執行finalize方法的物件。只在Linux/Solaris平臺下有效
-heap 顯示java堆詳細資訊,如使用哪種收集器、引數配置、分代情況等,在Linux/Solaris平臺下有效
-jisto 顯示堆中物件統計資訊,包含類、例項物件、合集容量
-permstat 以ClassLoader為統計口徑顯示永久代記憶體狀態。只在Linux/Solaris平臺下有效
-F 當虛擬機器程序對-dump選項沒有相應時。可使用這個選項強制生成dump快照。只在Linux/Solaris平臺下有效

生成java堆轉儲快照 Monitor.bin

輸入命令 jmap -dump:format=b,file=Monitor.bin 39312

在這裡插入圖片描述

2.5 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的語法對記憶體中的物件進行查詢統計。

分析java堆轉儲快照Monitor.bin

輸入命令 jhat Monitor.bin

在這裡插入圖片描述

2.6 jstack:java堆疊跟蹤工具

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

jstack 格式 jstack [option] vmid

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

選項 作用
-F 當正常輸出的請求不被響應時,強制輸出執行緒堆疊
-l 除堆疊外,顯示關於鎖的附加資訊
-m 如果呼叫到本地方法的話,可以顯示c/c++的堆疊

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

輸入命令 jstack 39312

在這裡插入圖片描述

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

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

3. JDK的視覺化工具

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

3.1 JConsole

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

在這裡插入圖片描述

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

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

在這裡插入圖片描述

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