首頁  >  文章  >  Java  >  如何利用JDK自帶jmap和jhat監控運行狀態的Java進程

如何利用JDK自帶jmap和jhat監控運行狀態的Java進程

不言
不言轉載
2018-10-22 16:00:473576瀏覽

這篇文章帶給大家的內容是關於如何利用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的。

如何利用JDK自帶jmap和jhat監控運行狀態的Java進程

2. 使用下列命令列:

jmap -dump:format=b,file=c:tempheapstatus.bin 15392

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

如何利用JDK自帶jmap和jhat監控運行狀態的Java進程

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

如何利用JDK自帶jmap和jhat監控運行狀態的Java進程

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

jhat c:tempheapstatus.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進程

################################### ##########

以上是如何利用JDK自帶jmap和jhat監控運行狀態的Java進程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除