說說內(nèi)存分析工具 MAT 的基本用法

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)系的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.MAT簡介:jvm內(nèi)存溢出/內(nèi)存泄漏問題分析定位神器 MAT 全稱Eclipse Memory Analysi...
    極簡架構(gòu)閱讀 22,847評論 1 20
  • 專業(yè)考題類型管理運行工作負責人一般作業(yè)考題內(nèi)容選項A選項B選項C選項D選項E選項F正確答案 變電單選GYSZ本規(guī)程...
    小白兔去釣魚閱讀 10,517評論 0 13
  • 一、獲取HPROF文件 HPROF文件是MAT能識別的文件,HPROF文件存儲的是特定時間點,java進程的內(nèi)存快...
    小村醫(yī)閱讀 1,782評論 0 2
  • MAT簡介 MAT(Memory Analyzer Tool),一個基于Eclipse的內(nèi)存分析工具,是一個快速、...
    This4U閱讀 1,202評論 0 5
  • 最近頻繁出差,每次總是忘記帶一些東西,今天用導圖做了一個物品規(guī)劃清單,不做不知道,一做嚇一跳,做這個清單也做了三個...
    李大鵬_365閱讀 458評論 0 1

友情鏈接更多精彩內(nèi)容