
Eclipse 的 MAT(Memory Analyzer Tool) 是一個內(nèi)存分析工具,它可以分析內(nèi)存中的對象、以及對象在內(nèi)存的占用大小等等豐富功能 。
1 加載堆存儲文件
安裝好 MAT 之后,雙擊打開進入主界面,接著點擊 File → Open Heap Dump 打開 JVM 的堆存儲文件。打開之后,就會讓我們選擇希望首次進入時的報告頁,這里使用默認:

2 概覽(Overview)
點擊 “Overview” ,打開概覽頁簽:

概覽頁簽的 Details 內(nèi)容區(qū),可以看到堆的大小、類、對象以及類加載器的個數(shù)。
接下來是個餅圖,直觀地描述了 dump 中占用內(nèi)存最大的對象的前幾名分布情況。
還可以使用鼠標移動并點擊餅圖中的某一塊,進行更多分析操作:

3 類實例數(shù)列表(Histogram)

這里展示了每個類所對應(yīng)的實例數(shù)列表。這里的每一列都可以點擊,修改其排序方式。
第一列是類名,第二列是這個類所創(chuàng)建的實例數(shù)。
這里重點說說 Shallow Heap 與 Retained Heap。
Shallow Heap 指的是當前對象所占用的內(nèi)存大小。一般來說,每種數(shù)據(jù)類型都有一個標準,比如 Integer 占用 4 字節(jié);Long 占用 8 字節(jié)。
要說 Retained Heap,就必須先說說 Retained set。Retained set 是對象 X 以及與對象 X 有關(guān)的一系列對象集合,當對象 X 被 GC 回收后,這個集合中的對象,也會被一并回收。 Retained Heap 就是當對象 X 被 GC 回收后,被釋放的內(nèi)存大小。
舉個例子,假設(shè) A 與 B 對象是垃圾回收的根,從 C 到 H 對象,它們之間的關(guān)系是這樣的:

那么 Retained set 中就會存在以下關(guān)系:
| 對象 X | 所對應(yīng)的 Retained set |
|---|---|
| E | E、G |
| C | C、D、E、F、G、H |
| A,B | A、B 、C、D、E、F、G、H |
Histogram 默認會使用估算模式來計算 Retained Heap,因為只依賴于當前已檢測到的集合中的對象數(shù),所以會比精確計算快很多。
也可以點擊 “計算器”圖標,進行精確計算,不過很耗時,需要耐心等待哦O(∩_∩)O~

還可以使用正則表達式,過濾出我們想要看的 Class。比如,嘗試在 ClassName 列的第一行輸入 dbcp:

Histogram 可以按照不同的視角來展示該列表,默認是以類的形式,也可以按“超類”、按”類加載器”以及按“包”的形式,比如下例就是按“包”的形式來查找我們想要搜尋的類:

4 支配樹(Dominator Tree)
Dominator Tree 中,顯示的是 dump 中占用 Retained Heap 最多的大對象。

Dominator Tree 體現(xiàn)了對象實例之間的支配關(guān)系 。 在對象引用圖中,如果所有指向?qū)ο?B 的路徑都必須經(jīng)過對象 A ,那么就認為對象 A 支配著對象 B。 如果對象 A 是離對象 B 最近的支配對象,那么對象 A 就是對象 B 的直接支配者 。 如果對象 A 支配著對象 B ,那么對象 A 的直接支配者也支配著對象 B。

左圖表示對象之間的引用關(guān)系,右圖表示左圖所對應(yīng)的支配樹關(guān)系 。 對象 A 和 B 由 GC Roots 直接支配。因為在到對象 C 的路徑中,即可以經(jīng)過 A ,也可以經(jīng)過 B ,所以對象 C 的直接支配者也是 GC Roots 。因此支配樹關(guān)系圖中的第一層是直連 A、B、C。 對象 F 與對象 D 相互引用,因為到對象 F 的所有路徑必然經(jīng)過對象 D ,所以,對象 D 是對象 F 的直接支配者 。 而到對象 D 的所有路徑中,必然經(jīng)過對象 C ,即使是從對象 F 到對象 D 的引用,從根節(jié)點出發(fā),也是經(jīng)過對象 C 的,所以,對象 D 的直接支配者為對象 C。 同理,對象 E 支配對象 G。 到達對象 H 的路徑,即可以通過對象 D ,也可以通過對象 E ,因此對象 D 和 E 都不能直接支配對象 H ,而經(jīng)過對象 C 既可以到達 D 也可以到達 E ,因此對象 C 為對象 H 的直接支配者 。
Dominator Tree 就是通過以上的邏輯判斷,把對象之間的引用關(guān)系轉(zhuǎn)換為對應(yīng)的支配樹關(guān)系的。