這篇文章帶給大家的內容是關於如何利用JDK自備jmap和jhat監控運行狀態的Java進程,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
對於處於運行狀態中的Java進程,JDK自帶了很多工具,允許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裡執行這個應用程式。
下面介紹如何使用jmap和jhat監控這個運行進程。
1. 首先取得這個Java運行進程的ID:15392。我是直接用Windows自帶的任務管理器取得進程ID的。
2. 使用下列命令列:
jmap -dump:format=b,file=c:tempheapstatus.bin 15392
jmap是JDK提供的工具,位於JDK安裝目錄的bin資料夾下。
執行命令列,會產生一個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
################################### ##########
以上是如何利用JDK自帶jmap和jhat監控運行狀態的Java進程的詳細內容。更多資訊請關注PHP中文網其他相關文章!