1. 程式人生 > 程式設計 >說說記憶體分析工具 MAT 的基本用法

說說記憶體分析工具 MAT 的基本用法

Eclipse 的 MAT(Memory Analyzer Tool) 是一個記憶體分析工具,它可以分析記憶體中的物件、以及物件在記憶體的佔用大小等等豐富功能 。

1 載入堆儲存檔案

安裝好 MAT 之後,雙擊開啟進入主介面,接著點選 File → Open Heap Dump 開啟 JVM 的堆儲存檔案。開啟之後,就會讓我們選擇希望首次進入時的報告頁,這裡使用預設:

2 概覽(Overview)

點選 “Overview” ,開啟概覽頁籤:

概覽頁籤的 Details 內容區,可以看到堆的大小、類、物件以及類載入器的個數。

接下來是個餅圖,直觀地描述了 dump 中佔用記憶體最大的物件的前幾名分佈情況。

還可以使用滑鼠移動並點選餅圖中的某一塊,進行更多分析操作:

3 類例項數列表(Histogram)

這裡展示了每個類所對應的例項數列表。這裡的每一列都可以點選,修改其排序方式。

第一列是類名,第二列是這個類所建立的例項數。

這裡重點說說 Shallow Heap 與 Retained Heap。

Shallow Heap 指的是當前物件所佔用的記憶體大小。一般來說,每種資料型別都有一個標準,比如 Integer 佔用 4 位元組;Long 佔用 8 位元組。

要說 Retained Heap,就必須先說說 Retained set。Retained set 是物件 X 以及與物件 X 有關的一系列物件集合,當物件 X 被 GC 回收後,這個集合中的物件,也會被一併回收。 Retained Heap 就是當物件 X 被 GC 回收後,被釋放的記憶體大小。

舉個例子,假設 A 與 B 物件是垃圾回收的根,從 C 到 H 物件,它們之間的關係是這樣的:

那麼 Retained set 中就會存在以下關係:

物件 X 所對應的 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,因為只依賴於當前已檢測到的集合中的物件數,所以會比精確計算快很多。

也可以點選 “計算器”圖示,進行精確計算,不過很耗時,需要耐心等待哦O(∩_∩)O~

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

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

4 支配樹(Dominator Tree)

Dominator Tree 中,顯示的是 dump 中佔用 Retained Heap 最多的大物件。

Dominator Tree 體現了物件例項之間的支配關係 。 在物件引用圖中,如果所有指向物件 B 的路徑都必須經過物件 A ,那麼就認為物件 A 支配著物件 B。 如果物件 A 是離物件 B 最近的支配物件,那麼物件 A 就是物件 B 的直接支配者 。 如果物件 A 支配著物件 B ,那麼物件 A 的直接支配者也支配著物件 B。

左圖表示物件之間的引用關係,右圖表示左圖所對應的支配樹關係 。 物件 A 和 B 由 GC Roots 直接支配。因為在到物件 C 的路徑中,即可以經過 A ,也可以經過 B ,所以物件 C 的直接支配者也是 GC Roots 。因此支配樹關係圖中的第一層是直連 A、B、C。 物件 F 與物件 D 相互引用,因為到物件 F 的所有路徑必然經過物件 D ,所以,物件 D 是物件 F 的直接支配者 。 而到物件 D 的所有路徑中,必然經過物件 C ,即使是從物件 F 到物件 D 的引用,從根節點出發,也是經過物件 C 的,所以,物件 D 的直接支配者為物件 C。 同理,物件 E 支配物件 G。 到達物件 H 的路徑,即可以通過物件 D ,也可以通過物件 E ,因此物件 D 和 E 都不能直接支配物件 H ,而經過物件 C 既可以到達 D 也可以到達 E ,因此物件 C 為物件 H 的直接支配者 。

Dominator Tree 就是通過以上的邏輯判斷,把物件之間的引用關係轉換為對應的支配樹關係的。