使用JDK自帶的jmap和jhat監控處於執行狀態的Java程式

i042416發表於2018-08-25

對於處於執行狀態中的Java程式,JDK自帶了很多工具,允許Java開發人員監控執行程式中的各種狀態,比如該程式內部建立了多少個物件例項,消耗了多少記憶體,等等。

使用JDK自帶的jmap和jhat監控處於執行狀態的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的。

使用JDK自帶的jmap和jhat監控處於執行狀態的Java程式

使用JDK自帶的jmap和jhat監控處於執行狀態的Java程式

2. 使用如下命令列:

jmap -dump:format=b,file=c:\temp\heapstatus.bin 15392

jmap是JDK提供的工具,位於JDK安裝目錄的bin資料夾下。

使用JDK自帶的jmap和jhat監控處於執行狀態的Java程式

執行命令列,會產生一個heap dump檔案: headstatus.bin

使用JDK自帶的jmap和jhat監控處於執行狀態的Java程式

3. 現在可以用另一個JDK工具,jhat來讀取這個dump檔案並解析。使用命令列:

jhat c:\temp\heapstatus.bin

使用JDK自帶的jmap和jhat監控處於執行狀態的Java程式

解析完畢後,jhat列印出的輸出提示我們Snapshot resolved,可以從本地伺服器的7000埠來檢視。

訪問 http://localhost:7000 ,能看到jmap解析結果。

localhost:7000 in browser:

使用JDK自帶的jmap和jhat監控處於執行狀態的Java程式

點選超連結“jmap Tool”進入明細:下圖意思是我的Tool類的例項@0x7166babd8的成員變數,即計數器的值已經累加到49了。

使用JDK自帶的jmap和jhat監控處於執行狀態的Java程式

4. 如果大家不喜歡命令列,也可以用一個Eclipse的外掛,MAT – Memory Analyzer Tool,也能完成和jmap與jhat命令同樣的功能。

使用JDK自帶的jmap和jhat監控處於執行狀態的Java程式

這個外掛安裝後,在Eclipse裡會多出一個檢視:

使用JDK自帶的jmap和jhat監控處於執行狀態的Java程式

直接將jmap生成的heap dump檔案拖到MAT檢視裡,就能自動解析並顯示結果了。

點按鈕“Find object by address”:

使用JDK自帶的jmap和jhat監控處於執行狀態的Java程式

同樣能夠看到之前在localhost:7000裡看到的物件例項的明細:

You can get the same result as you get previously in

使用JDK自帶的jmap和jhat監控處於執行狀態的Java程式

使用JDK自帶的jmap和jhat監控處於執行狀態的Java程式

要獲取更多Jerry的原創技術文章,請關注公眾號"汪子熙"或者掃描下面二維碼:


使用JDK自帶的jmap和jhat監控處於執行狀態的Java程式

使用JDK自帶的jmap和jhat監控處於執行狀態的Java程式


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2212823/,如需轉載,請註明出處,否則將追究法律責任。

相關文章