MAT(Memory Analyzer Tool) 是基於heap dumps來進行分析的,所以首先必須通過一定的手段得到JAVA堆的DUMP文件。JDK自帶的。JConsole 或者 JMAP都是不錯的工具。
準備
(·)下載eclipse3.7;
(·)安裝MAT插件:http://download.eclipse.org/mat/1.1/update-site/ ;
linux查看heap命令:jmap -heap pid;
linux導出heap dump命令:jmap -dump:format=b,file=文件位置 pid。
例如:tomcat的進程好爲10301,導出heap到/web/tomcat.heap的命令:jmap -dump:format=b,file=/web/tomcat.heap 10301。
安裝完MAT後,進入MAT的Perspectives視圖,通過File > Open Heap Dump...打開heapDumps文件,就可以看到MAT給出了overview page
在底部的Actions有 :
(1)histogram
列出了有每個種有多少實例,每種類型的實例集合的 shallow size 和 retained size . shallow size指的是對象所消耗的內存大小,如每個對象引起消耗4個字節,或者8個字節,取決於你的操作系統(32位,還是64位), retained size的概念依賴於Retained set 的概念,Retained set 指的是當對象X被回收時,所有被垃圾回收器移除的對象集合,
Retained size 即是Retained set所保持的內存大小。
當然histogram 不僅可以通過類進行數據組織,還可以通過class loader, packages or superclass .來進行數據的組織。
(2)The Dominator Tree
列出了堆中最大的對象,第二層級的節點表示當被第一層級的節點所引用到的對象,當第一層級對象被回收時,這些對象也將被回收。這個工具可以幫助我們定位對象間的引用情況,垃圾回收時候的引用依賴關係。
(3)Path to GC Roots
被JVM持有的對象,如當前運行的線程對象,被systemclass loader加載的對象被稱爲GC Roots, 從一個對象到GC Roots的引用鏈被稱爲Path to GC Roots, 通過分析Path to GC Roots可以找出JAVA的內存泄露問題,當程序不在訪問該對象時仍存在到該對象的引用路徑。
其他參考資料:
使用Memory Analyzer tool(MAT)分析內存泄漏(一)