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

對於處於運行狀態中的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監控這個運行進程。插件

1. 首先取得這個Java運行進程的ID:15392。我是直接用Windows自帶的任務管理器得到進程ID的。命令行

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

2. 使用以下命令行:code

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

jmap是JDK提供的工具,位於JDK安裝目錄的bin文件夾下。對象

執行命令行,會產生一個heap dump文件: headstatus.bin進程

3. 如今能夠用另外一個JDK工具,jhat來讀取這個dump文件並解析。使用命令行:

jhat c:\temp\heapstatus.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的原創技術文章,請關注公衆號"汪子熙"或者掃描下面二維碼:

相關文章
相關標籤/搜索