1. JDK命令行工具
1.1. jps:虛擬機進程狀況工具
JVM Process Status Tool, 顯示系統內所有的HotSpot虛擬機進程,用於查看當前在jvm中運行的程序,包括虛擬機執行主類的名稱以及進程ID。
1.2. jstat:虛擬機統計信息監視工具
JVM Statistics Monitoring Tool, 用於收集Hotspot虛擬機各方面的運行數據,包括類裝載、內存、垃圾收集、JIT編譯等運行數據。
1.3. jinfo:Java配置信息工具
Configuration Info for Java, 顯示虛擬機配置信息。可以實時的查看和調整虛擬機各項參數,即VM參數。
1.4. jmap:Java內存映像工具
Memory Map for Java,生成虛擬機的內存轉儲快照(heapdump文件),查看Finalizer線程執行finalize方法的對象,顯示堆的詳細信息(如回收器、參數配置、分代狀況等),顯示堆中對象的統計信息(對象數量,類數量,合計容量等)等等,不過只有存儲快照可以在windows下運行。另外,還有其他的生成方法為通過VM參數-XX:+HeapDumpOnOutOfMemoryError,可以在出現OOM異常時候生成dump文件。
1.5. jhat:虛擬機堆存儲快照分析工具
JVM Heap Analysis Tool,與jmap搭配使用,用於分析heapdump文件,會建立一個HTTP/HTML服務器,讓用戶可以在浏覽器上查看分析結果。
1.6. jstack:Java堆棧跟蹤工具
Stack Trace for Java,顯示虛擬機當前時刻的線程快照,也稱為threaddump或javacore文件。即每一條線程正在執行的方法堆棧的集合,通過該命令一般用於檢測線程長時間停頓原因,死鎖,死循環,請求外部資源等待等導致線程長時間停頓的原因。
2. JDK的可視化工具
2.1. JConsole
位於JDK/bin目錄下,啟動後可以自動搜索出本機運行的所有虛擬機進程,然後可以進行選擇一個進程進行監控。
這裡寫了個生產者消費者的代碼用於測試,也就是PCTest,共有3個生產者和3個消費者,每次生產的節點都有一個byte[1024]用於占內存。連接之後,可以看到概述,然後每個頁面也可以看到具體的相關信息:
可以通過查看內存情況各個區的分配情況,來對vm參數進行配置調整
在線程頁面,也可以看到每個線程的運行情況,如運行狀態,等待的鎖,持有的鎖等等,也可以檢測死鎖情況
2.2. VisualVM
位於JDK/bin目錄下,啟動後可以自動搜索出本機運行的所有虛擬機進程,然後可以進行選擇一個進程進行監控。
VisualVM功能和jconsole差不太多,不過提供了一個更為好看的界面,這是啟動時各個進程的情況。
VisualVM提供和jconsole一樣的對內存使用情況的概述,以及線程情況的概述
還有其他一些功能,這裡就不在贅述。
3. 其他
3.1 Eclipse Memory Analyzer
Eclipse Memory Analyzer與前面兩者相比,提供了更為細節的分析,包括引用鏈的情況,各個線程、對象占據的內存等等。
首先需要安裝Eclipse Memory Analyzer插件,通過Eclipse的Install from site進行安裝,如圖所示:
還是用生產者消費者程序作為樣例,配置好以下jvm參數:
-Xmx10m -Xms10m -XX:+HeapDumpOnOutOfMemoryError
為了更快的發生內存溢出,也將每個節點的內存設置為了1M大小,程序運行之後,很快就發生了OOM錯誤
從上面可以看出,內存溢出的時候,生成了堆存儲快照
Dumping heap to java_pid8056.hprof …
然後在工程目錄下,可以看到該堆存儲快照
直接雙擊打開,可以選擇默認的讓插件自己進行可疑內存洩露分析,根據堆的大小,在一定時間內會出結果,如下:
這是堆中各個線程的使用內存的情況,在這個之下,還有插件分析的結果:
通過Details信息,可以查看具體的信息
這裡面shallow heap代表對象本身所占的空間,retained heap代表如果把這個對象給gc了,可以收回多少空間
4.參考資料
[1]《深入理解Java虛擬機》第二版,周志明著