1. 程式人生 > >Java JVM(十一):MAT 工具的使用

Java JVM(十一):MAT 工具的使用

    MAT是一個基於Eclipse 的記憶體分析工具,是一個基礎外掛。
當我們整合成功之後,開啟一個 hprof 檔案,如下圖所示:

  • 漏洞監測報告:自動檢測 dump 檔案 的漏洞。報告哪些物件還存活,並且為什麼沒有被垃圾回收。
  • 元件報告:分析可能引用記憶體問題的物件:比如 空字串,空集合等。
  • 重新開啟之前的執行報告。
    本人在分析的時候,主要使用了第一個(業務需求需要分析為什麼記憶體中持有多個 User物件)。
在打開了一個 dump 檔案之後,會有如上圖所示,那麼,在左下角有 Histogram:列出每個類的實體數量,列出實體後,就可以找到誰引用誰。例如,假設有如下程式:
public class Student {
	public static void main(String[] args) {
		Stu1 stu1 = new Stu1();
		Stu2 stu2 = new Stu2();
		stu1.setStu2(stu2);
		
		try {
			Thread.sleep(60 * 60 * 1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}
class Stu1{
	private String name; 
	private Stu2 stu2;
	public void setStu2(Stu2 stu2){this.stu2 = stu2;}
}
class Stu2{
	private String name;
}

那麼,就可以如下圖找到誰引用誰(by outgoing reference 就是該物件引用誰, by incoming references 就是 誰引用它):


例如:點選 Stu1 的 by outgoing references,如下圖:



        可以看到,Stu1 引用了 1個 Stu2 物件,這也是符合上述的main函式的。
再例如點選 Stu2 的by incoming references,如下圖:


可以看到,Stu2 被1個 Stu1 物件 引用,這也是符合上述的main函式的。 工作的時候,利用以上的資訊,就可以知道A物件被哪些物件引用,這樣就有利於解決記憶體洩露問題。這也是我使用 MAT 的一些經驗,如果大家還有使用它的好的技巧或者是其他好的工具,求教導。