MAT(Memory Analyzer Tool)工具使用

插件更新地址:
http://download.eclipse.org/mat/1.0/update-site/

先調用jdk的工具得到heap使用情況

我安裝的是jdk1.6

C:/>Java -version

java version "1.6.0_11"

Java(TM) SE Runtime Environment (build 1.6.0_11-b03)

Java HotSpot(TM) Client VM (build 11.0-b16, mixed mode, sharing)

調用jdk工具jps查看當前的java進程

C:/>jps

3504 Jps

3676 Bootstrap

3496 org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar

調用jmap工具得到信息

C:/>jmap -dump:format=b,file=heap.bin 3676

Dumping heap to C:/heap.bin ...

Heap dump file created

這時,我們的C盤根目錄,就生成了heap.bin文件,用eclipse的file---->open打開這個文件,首先是一個啓動圖:

這裏可以選擇查看

1、內存泄露報表,自動檢查可能存在內存泄露的對象,通過報表展示存活的對象以及爲什麼他們沒有被垃圾收集;

2、對象報表,對可穎對象的分析,如字符串是否定義重了,空的collection、finalizer以及弱引用等。

我這裏選擇的是查看內存報表,以下是截的簡略圖:

 

通過報表展示,蠻清楚的,下面還有詳細的說明,這裏就沒有帖圖了,有興趣的可以繼續探究。




當成功啓動MAT後,通過菜單選項“File->Open heap dump...”打開指定的dump文件後,將會生成Overview選項,在概況中可以初步查看佔用內存最多的幾個類以及對應的一些屬性、引用層次和統計信息

使用MAT(Memory Analyzer Tool)分析內存泄漏

在Overview選項中,以餅狀圖的形式列舉出了程序內存消耗的一些基本信息,其中每一種不同顏色的餅塊都代表了不同比例的內存消耗情況。如果說 需要定位內存泄露的代碼點,我們可以通過Dominator Tree菜單選項來進行排查(MAT工具僅僅只是一個輔助,分析OutofMemory並不存在一個固定的方式和準則,因此仔細觀察和分析才能夠找到問題 所在)

使用MAT(Memory Analyzer Tool)分析內存泄漏

Histogram圖表中主要統計了消耗佔比較高的類的實例數量及佔用空間,Shallow Size: 對象自身佔用的內存大小,不包括它引用的對象Retained Size: 當前對象大小 + 當前對象直接或間接引用的對象大小的總和 - 被GC Roots直接或間接引用的對象大小的總和

使用MAT(Memory Analyzer Tool)分析內存泄漏

Top Consumers圖表可以更直觀地看到內存消耗佔比最多的類,由於很多類都囊括在ClassLoader中,因此還需要進一步查看引用的層級。如果一次觀察的結果不夠明顯,可以對比不同服務器(不同組)、不同時間點的內存使用情況,進一步縮小排查範圍。

使用MAT(Memory Analyzer Tool)分析內存泄漏

List objects with outgoing/incoming references 根據引用層級查看問題根源

使用MAT(Memory Analyzer Tool)分析內存泄漏

Leak suspects,MAT可以自動生成可疑泄露點的報告,能夠從以下幾點全面分析問題:

  • Shortest Paths To the Accumulation Point
  • Accumulated Objects in Dominator Tree
  • Accumulated Objects by Class in Dominator Tree
  • All Accumulated Objects by Class

使用MAT(Memory Analyzer Tool)分析內存泄漏


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章