2013-03-01

Tags: eclipse , 程式語言 , java

Memory Analyzer Tool (MAT) 這工具蠻好用的,但是常常太久沒用之後就忘了這東東要怎麼操作,所以還是乖乖的寫份memo比較實在...囧rz
===========================================================================
<MAT功能簡介>

請參考下述儿份文章
1. Memory Analyzer Tool (MAT) 簡介
2. 10 Tips for using the Eclipse Memory Analyzer
===========================================================================
<MAT比較重要的儿項功能>

條列如下。一開始可能看不太懂,多實作儿次後就會有fu了...:)

1.Histogram:列出每個class產生了多少個instance
2.Dominator Tree:列出物件實例(Object instance)的樹狀結構。它的樹狀階層代表父階層參照(reference)多少子階層的物件
3.Leak Suspects report:產生memory leak report
4.Inspector:列出物件裡的資料明細。這功能就像用ide進行debug時,只要游標指到變數名稱,ide就自動幫你帶出該變數內容

除了上述部份外,幾乎每個功能表(或圖)裡都會出現ShallowHeap跟RetainedHeap這二個欄類。這二個東西是指什麼還蠻重要的,建議把它的差異搞懂(可以 參考這份文章)。通常我會看RetainedHeap的值,因為它包含了該物件自身與所有被該物件參照到的所有物件全部加總起來的記憶體使用量
===========================================================================
<MAT實際操作範例>

1.先產生一個會讓heap炸掉的程式

public class MatDemo {

/**
* @param args
*/
public static void main(String[] args) {
List datas = new ArrayList();
int counter = 1;
while(true){
datas.add(counter);
counter ++;
}
}
}
2.接下來就是分析這個炸掉的HeapDump啦,我常用的MAT功能是下圖裡面紅框標示的這儿個

3.Histogram功能展示。從下圖中可以看出來Integer class的instance超多,吃掉一堆memory

4.Dominator Tree功能展示。從下圖中看出有個Object array內容超多,可能有問題

接者追查這個物件被哪些物件參考(reference),發現它被某個ArrayList instance給參考,所以這個ArrayList instance有可能是原兇


觀察GC roots path,發現這個ArrayList instance是Object array的上一層物件。也就是要進行GC時,必需這個ArrayList instance沒被參照才可以進行Object array的GC動作,所以確定這個ArrayList instance就是memory leak的兇手


5.Leak Suspects功能展示。照下圖流程就可以看到程式執行到哪一行時把heap給炸了