eclipse Memory Analyzer(MAT) 記憶體分析
如果使用DDMS確實發現了我們程式中存在記憶體洩露,那如何定位到具體出現問題的程式碼片段,最終找到問題所在呢?如果從頭到尾分析程式碼邏輯,那肯定會把人逼瘋,特別是在維護別人寫的程式碼的時候。這裡介紹一個極好的記憶體分析工具Memory Analyzer Tool(MAT)。
-
在Eclipse中安裝和使用MAT步驟
-
Eclipse安裝Allocation tracker外掛
MAT是一個Eclipse外掛,同時也有單獨的RCP客戶端。
如果安裝Eclipse外掛(更方便使用,本文介紹的是使用Eclipse外掛)。使用http://download.eclipse.org/mat/1.2/update-site/進行安裝。
-
生成.hprof檔案
開啟Eclipse,切換到DDMS透檢視,同時確認Devices、Heap和logat檢視已經開啟。
將手機裝置連線到電腦,並確保使用“USB除錯“模式連結,
連結成功後在Devices檢視中就會看到裝置的序列號,和裝置正在執行的部分程式。
選中想要分析的應用程式,在Devices檢視上方的一行圖示按鈕中,同時選中“Update Heap”和“Dump HPROF file”按鈕。
彈出Getting Started嚮導對話方塊,選中Leak Suspects Report,點選Finish按鈕。
-
使用MAT開啟並匯入.hprof檔案
Eclipse自動跳轉到Memory Analysize透檢視,並開啟default_report視窗。
該視窗列出了,可能有問題的程式碼片段。點選Details可以檢視相關的詳情。
在Shortest Paths To the Accumulation Point的列表中,我們可以追溯到問題程式碼的類樹的結構,並找到自己程式碼中的類。
在列表中,有兩列Shallow Heap和Retained Heap。Shallow Heap指的是所有的例項的記憶體總和。Retained Heap指的是所有類例項被分配的記憶體總和,裡面包括它們所有引用的物件。
在Accumulated Objects列表中,我們可以看見建立的大量的物件。
在Accumulated Objects by Class列表中,我們能看見建立大量物件相關的類。
-
使用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按鈕,彈出新的視窗,列出了對中最大的物件,第二層級節點標識當被第一層級的節點所引用到的物件,當第一層級的節點被回收時,這些物件也將會回收。
這個工具可以幫我們定位物件間的引用情況,垃圾回收時候的引用關係。
相關文章
- jvm-44-jvm 記憶體效能分析工具 Eclipse Memory Analyzer Tool (MAT) / 記憶體分析器 (MAT)JVM記憶體Eclipse
- Eclipse Memory Analyzer入門教程Eclipse
- MAT(Memory Analyzer Tool)下載和安裝
- [轉帖]10 Tips for using the Eclipse Memory AnalyzerEclipse
- 記一次透過Memory Analyzer分析記憶體洩漏的解決過程記憶體
- Eclipse Memory Analyzer (MAT)的安裝後提示JDK版本不對要升級到jdk_17EclipseJDK
- Unity Memory Profiler 記憶體分析Unity記憶體
- Memory記憶體傳值記憶體
- 記憶體管理(Debug Memory Graph)記憶體
- Allowed memory size 記憶體不足記憶體
- 利用MAT分析JVM記憶體問題,從入門到精通(二)JVM記憶體
- MAT工具定位分析Java堆記憶體洩漏問題方法Java記憶體
- 12. 記憶體管理(Memory Management)記憶體
- eclipse中設定JVM記憶體EclipseJVM記憶體
- eclipse設定JVM記憶體堆EclipseJVM記憶體
- iOS Memory 記憶體詳解 (長文)iOS記憶體
- 照片記憶編寫軟體:Memory Pictures for MacMac
- Android Studio Profiler Memory (記憶體分析工具)的簡單使用及問題Android記憶體
- ABAP Memory Inspector 裡對動態記憶體物件的記憶體消耗度量方式記憶體物件
- Memory Cleaner for Mac一鍵記憶體清理工具Mac記憶體
- Ubuntu記憶體分析Ubuntu記憶體
- JVM記憶體分析JVM記憶體
- CUDA 有 unified memory 還需要記憶體優化嗎?Nifi記憶體優化
- 關於redis記憶體分析,記憶體優化Redis記憶體優化
- 【VMware ESXi】把硬碟當記憶體用?VMware 記憶體分層(Memory Tiering),你值得擁有!硬碟記憶體
- 使用 Chrome 開發者工具的 Memory 標籤頁分析記憶體洩漏問題Chrome記憶體
- nginx共享記憶體分析Nginx記憶體
- 記憶體效能分析工具記憶體
- 11-記憶體分析記憶體
- Go記憶體逃逸分析Go記憶體
- Java 物件記憶體分析Java物件記憶體
- 20201209——java記憶體分析Java記憶體
- Composer 記憶體不足解決方案 PHP Fatal error: Out of memory記憶體PHPError
- Unity效能分析(三)記憶體分析Unity記憶體
- 實戰分析Tomcat的類載入器結構(使用Eclipse MAT驗證)TomcatEclipse
- Swoole 原始碼分析——記憶體模組之記憶體池原始碼記憶體
- Linux記憶體洩露案例分析和記憶體管理分享Linux記憶體洩露
- 【MEMORY】Oracle記憶體結構資源常用檢視及sqlOracle記憶體SQL
- composer 報錯:超出記憶體大小的問題(Allowed memory size )記憶體