對於處於運行狀態中的Java進程,JDK自帶了不少工具,容許Java開發人員監控運行進程中的各類狀態,好比該進程內部建立了多少個對象實例,消耗了多少內存,等等。java
本文基於JDK1.8而寫成。服務器
我下面寫了一個最簡單的Java類,包含了一個無限循環,每隔5秒增長一個計數器的值。工具
package jmap; class Tool{ private int count = 0; public void Run() throws InterruptedException{ while(true){ System.out.println("Hello: " + this.count++); Thread.sleep(5000); } } } public class JMapTest { public static void main(String[] args) throws InterruptedException { Tool tool = new Tool(); tool.Run(); } }
在Eclipse裏執行這個應用。this
下面介紹如何使用jmap和jhat監控這個運行進程。spa
1. 首先取得這個Java運行進程的ID:15392。我是直接用Windows自帶的任務管理器得到進程ID的。插件
2. 使用以下命令行:命令行
jmap -dump:format=b,file=c:tempheapstatus.bin 15392code
jmap是JDK提供的工具,位於JDK安裝目錄的bin文件夾下。orm
執行命令行,會產生一個heap dump文件: headstatus.bin對象
3. 如今能夠用另外一個JDK工具,jhat來讀取這個dump文件並解析。使用命令行:
jhat c:tempheapstatus.bin
解析完畢後,jhat打印出的輸出提示咱們Snapshot resolved,能夠從本地服務器的7000端口來查看。
訪問http://localhost:7000,能看到jmap解析結果。
localhost:7000 in browser:
點擊超連接「jmap Tool」進入明細:下圖意思是個人Tool類的實例@0x7166babd8的成員變量,即計數器的值已經累加到49了。
4. 若是你們不喜歡命令行,也能夠用一個Eclipse的插件,MAT – Memory Analyzer Tool,也能完成和jmap與jhat命令一樣的功能。
這個插件安裝後,在Eclipse裏會多出一個視圖:
直接將jmap生成的heap dump文件拖到MAT視圖裏,就能自動解析並顯示結果了。
點按鈕「Find object by address」:
一樣可以看到以前在localhost:7000裏看到的對象實例的明細:
You can get the same result as you get previously in
要獲取更多Jerry的原創技術文章,請關注公衆號"汪子熙"或者掃描下面二維碼: