eclipse Memory Analyzer(MAT) 記憶體分析

心鑫發表於2013-11-07
2  安裝Memory Analyzer(MAT)

如果使用DDMS確實發現了我們程式中存在記憶體洩露,那如何定位到具體出現問題的程式碼片段,最終找到問題所在呢?如果從頭到尾分析程式碼邏輯,那肯定會把人逼瘋,特別是在維護別人寫的程式碼的時候。這裡介紹一個極好的記憶體分析工具Memory Analyzer Tool(MAT) 

  1. Eclipse中安裝和使用MAT步驟 

  1. Eclipse安裝Allocation tracker外掛 

MAT是一個Eclipse外掛,同時也有單獨的RCP客戶端。 

如果安裝Eclipse外掛(更方便使用,本文介紹的是使用Eclipse外掛)。使用http://download.eclipse.org/mat/1.2/update-site/進行安裝。 

  1. 生成.hprof檔案 

開啟Eclipse,切換到DDMS透檢視,同時確認DevicesHeaplogat檢視已經開啟。 

將手機裝置連線到電腦,並確保使用USB除錯“模式連結, 

連結成功後在Devices檢視中就會看到裝置的序列號,和裝置正在執行的部分程式。 

選中想要分析的應用程式,在Devices檢視上方的一行圖示按鈕中,同時選中“Update Heap”和“Dump HPROF file”按鈕。 


彈出Getting Started嚮導對話方塊,選中Leak Suspects Report,點選Finish按鈕。 


  1. 使用MAT開啟並匯入.hprof檔案 

Eclipse自動跳轉到Memory Analysize透檢視,並開啟default_report視窗。 


該視窗列出了,可能有問題的程式碼片段。點選Details可以檢視相關的詳情。 


Shortest Paths To the Accumulation Point的列表中,我們可以追溯到問題程式碼的類樹的結構,並找到自己程式碼中的類。 

在列表中,有兩列Shallow HeapRetained HeapShallow Heap指的是所有的例項的記憶體總和。Retained Heap指的是所有類例項被分配的記憶體總和,裡面包括它們所有引用的物件 


Accumulated Objects列表中,我們可以看見建立的大量的物件。 


Accumulated Objects by Class列表中,我們能看見建立大量物件相關的類。 

  1. 使用MAT檢視工具分析記憶體 

點選Histogrm按鈕,顯示了Histogrm檢視,它顯示了一個可以排序的類例項的列表。並可以根據自己的意願,修改排序。 


右擊某一行,選擇ListObjects>with incoming references,它會生成一個heap上的所有該物件陣列的列表,我們可以按照Shallow Heap的使用情況來排序。 


選擇一個較大的物件,右擊,選擇Path to GCRoot->exclude weak/soft reference 

JVM持有的物件,如當前執行的執行緒物件,被systemclass loader載入的物件稱為GC Roots。從一個物件到GC Roots的引用鏈被稱為Path to GC Roots 

通過分析Path to GC Root可以找出Java的記憶體洩露問題,當程式不在訪問該物件時,仍然存在到該物件的引用路徑。 


MAT不會明確的告訴我們這就是記憶體洩露,因為它也不知道這個東西是不是程式需要的,只有程式設計師知道。 

 

點選Domanitor_tree按鈕,彈出新的視窗,列出了對中最大的物件,第二層級節點標識當被第一層級的節點所引用到的物件,當第一層級的節點被回收時,這些物件也將會回收。 


這個工具可以幫我們定位物件間的引用情況,垃圾回收時候的引用關係。 


相關文章