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 的一些經驗,如果大家還有使用它的好的技巧或者是其他好的工具,求教導。




發佈了97 篇原創文章 · 獲贊 19 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章