JVM監控及診斷工具
命令列工具
- jps
jps類似於linux中的ps命令,用於列印正在執行的java程序相關的資訊。主要引數有:
1)-l 列印模組名以及包名
2)-v 列印傳給JVM的引數
3)-m列印傳給main方法的引數 -
jstat
用於列印JVM程序的效能資料,主要用來檢視JVM gc相關的資料。實際中用法如下圖:
jstat用法
列印的各引數含義如下:
1:S0C、S1C、S0U、S1U:Survivor 0/1區容量(Capacity)和使用量(Used)
2:EC、EU:Eden區容量和使用量
3:OC、OU:年老代容量和使用量
4:MC、MU:元資料區容量和使用量
5:CCSC、CCSU:壓縮類空間容量和使用量
5:YGC、YGT:年輕代GC次數和GC耗時
6:FGC、FGCT:Full GC次數和Full GC耗時
7:GCT:GC總耗時
jstat可以用來判斷系統是否出現了記憶體洩漏,方法是通過一短長時間的觀察OU的增長情況,如果OU穩定增長,則有可能出現記憶體洩漏。
-
jmap
jmap用於分析JVM中堆中的物件,包括生成堆的dump檔案,這個命令同樣有多條子命令。常用的命令有如下幾個:
1:jmap -heap:用於列印堆記憶體使用情況,包括使用的GC演算法、堆配置引數和各代中堆記憶體使用,示例如下圖所示:
jmap -heap使用示例
2:jmap -histo:live:用於列印堆中各個類中的例項數目以及佔用記憶體的大小,並排序。使用的示例如下:
jmap -histo:live使用示例
3:jmap -dump :用於匯出JVM的堆快照檔案,方便用GUI工具分析。
jmap -dump使用示例
4:jmap -finalizerinfo:列印所有待 finalize 的物件。
jmap -finalizerinfo使用示例
注意:jmap依賴於 Java 虛擬機器的Attach API,因此只能監控本地的java程序。一旦開啟 Java 虛擬機器引數DisableAttachMechanism(即使用引數-XX:+DisableAttachMechanism),基於 Attach API 的命令將無法執行。
- jinfo
jinfo命令可用來檢視目標 Java 程序的引數,如傳遞給 Java 虛擬機器的-X(即輸出中的 jvm_args)、-XX引數(即輸出中的 VM Flags),以及可在 Java 層面通過System.getProperty獲取的-D引數(即輸出中的 System Properties)。 - jstack
jstack:主要用來檢視某個Java程序內的執行緒堆疊資訊,而用可以用於發現死鎖。有如下兩個引數:
1:-l (long listings)會打印出額外的鎖資訊,在發生死鎖時可以用jstack -l pid來觀察鎖持有情況。
2: -m (mixed mode),不僅會輸出Java堆疊資訊,還會輸出C/C++堆疊資訊(比如Native方法)
如果執行緒數太多,可以藉助分析作業系統特用的分析工具找出用時最長的執行緒,然後通過如下圖的命令定位到具體的堆疊資訊:
GUI工具
Eclipse MAT
官網地址 ofollow,noindex">http://www.eclipse.org/mat/downloads.php ,下載最新的包,解壓放到eclipse的dropins目錄下,重啟eclipse便可以使用MAT工具分析堆記憶體了。Memory Analysis檢視的開啟方工如下圖:

Memory Analysis

shallow Heap與 Retained Heap

dominator_tree檢視