天天看點

Mat使用詳解背景Mat的作用Mat的使用步驟Overview下功能解釋一級導航欄功能說明常見溢出的幾個場景

背景

筆記中躺了很久的文章,今天用到Mat時發現之前寫的内容還算清晰,分享出來;

如下所舉例使用的dump檔案是針對之前使用的ignite庫溢出時的dump檔案;關于ignite的概念此處不再叙述,本篇文章重點則在于Mat即可

Mat的作用

MAT是Memory Analyzer tool的縮寫,是一種快速,功能豐富的Java堆分析工具,能幫助你查找記憶體洩漏和減少記憶體消耗。很多情況下,我們需要處理測試提供的hprof檔案,分析記憶體相關問題,那麼MAT也絕對是不二之選。 Eclipse可以下載下傳插件結合使用,也可以作為一個獨立分析工具使用;下載下傳位址: https://pan.baidu.com/s/1NDUR0E3WGrktm1qwoZHWfg 提取碼:agxr ;不用謝,雷鋒

Mat的使用步驟

打開Mat後File>OpenHeapDump打開一個對應的dump檔案後,此時對應的打開後結果如圖所示:

Mat使用詳解背景Mat的作用Mat的使用步驟Overview下功能解釋一級導航欄功能說明常見溢出的幾個場景

預設情況下打開該dump檔案後,直接展示的就是一個Overview(概覽)的頁簽,其中可以看到上面标注為(1,2)的地方所對應的圖示與Overview頁簽中所對應的部分圖示是相似的;如果你不小心關掉了Overview的頁簽,那麼直接單擊目前dump頁簽第一行導航欄的第一個 I字的圖示即可,同理,如果此時想要打開Histogram,那麼在不打開Overview的情況下,直接點選第一行導航欄的第二個圖示即可;......

Overview下功能解釋

Overview頁簽下分别包含了:Actions,Reports,Step By Step 三大塊功能;每一塊功能下的子集所對應的作用分别是:

  • Actions:
    • Histogram 列出每個類所對應的對象個數,以及所占用的記憶體大小;
    • Dominator Tree 以占用總記憶體的百分比的方式來列舉出所有的執行個體對象,注意這個地方是直接列舉出的對應的對象而不是類,這個視圖是用來發現大記憶體對象的
    • Top Consumers:按照類和包分組的方式展示出占用記憶體最大的一個對象
    • Duplicate Classes:檢測由多個類加載器所加載的類資訊(用來查找重複的類)
  • Reports:
    • Leak Suspects:通過MAT自動分析目前記憶體洩露的主要原因
    • Top Components:Top元件,列出大于總堆1%的元件的報告
  • Step By Step:
    • Component Report:元件報告,分析屬于公共根包或類加載器的對象;
    上述所有被标注加粗的部分,是記憶體溢出dump分析時較為常用的功能點也是下面主要講解的内容。
原創聲明:作者:Arnold.zhao 部落格園位址:https://www.cnblogs.com/zh94

Histogram

通過Histogram 列出每個類所對應的對象個數,以及所占用的記憶體大小;

此處選中一個ClassName單擊後,通過左上角Inspector可以看到目前類的回收情況,記憶體位址,等

Mat使用詳解背景Mat的作用Mat的使用步驟Overview下功能解釋一級導航欄功能說明常見溢出的幾個場景

補充解釋:

  • 字段一:表示目前類所對應的對象數量
  • 字段二:Shallow Size是對象本身占據的記憶體的大小,不包含其引用的對象。對于正常對象(非數組)的Shallow Size由其成員變量的數量和類型來定,而數組的ShallowSize由數組類型和數組長度來決定,它為數組元素大小的總和;
  • 字段三:Retained Size=目前對象大小+目前對象可直接或間接引用到的對象的大小總和。(間接引用的含義:A->B->C,C就是間接引用) ,并且排除被GC Roots直接或者間接引用的對象;

關于紅框内的Statics,Attributes,Classhierarchy,Value則分别表示目前類的靜态變量,屬性,目前類的層次結構圖,以及目前類所對應的值Value;

注意:目前Histogram的列屬性:ClassName,Objects,ShallowHeap,RetainedHeap這幾個列屬性下面都是有提供一個輸入框,通過該輸入框可以進行相關類的檢索,比如:在ClassName下輸入一個正則.quark.那麼則擷取到所有包路徑為quark的類資訊;

Dominator Tree

以占用總記憶體的百分比的方式來列舉出所有的執行個體對象,可以用來發現大記憶體對象;

Mat使用詳解背景Mat的作用Mat的使用步驟Overview下功能解釋一級導航欄功能說明常見溢出的幾個場景

如上圖所示:可以看到ConcurrentHashMap@0x60191cfa8這個對象占據了98.92%的堆大小,是以基本就可以斷定,目前項目之是以會down機的主要原因是,ConcurrentHashMap溢出所導緻的問題;

那麼當我們需要檢視,目前該ConcurrentHashMap@0x60191cfa8對象都引用了那些資料,以及目前該對象是被那幾個對象所引用的,如何檢視?

滑鼠在目前所要檢視的對象右鍵,點選List Objects可以看到分别提供了:with outgoing references(檢視目前該對象的所有的引用資訊) 和 with incoming references(檢視目前該對象是被那幾個對象所引用的) ;

Mat使用詳解背景Mat的作用Mat的使用步驟Overview下功能解釋一級導航欄功能說明常見溢出的幾個場景

Leak Suspects

通過MAT自動分析目前記憶體洩露的主要原因

Mat使用詳解背景Mat的作用Mat的使用步驟Overview下功能解釋一級導航欄功能說明常見溢出的幾個場景

可以看到,目前MAT所給出記憶體洩露的主要原因是:目前執行個體java.util.concurrent.ConcurrentHashMap被加載自system class loader,共占用了 98.92%的堆記憶體,這個執行個體被引用自org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl并且這個CacheObjectBinaryProcessorImpl這個對象是加載自LaunchedURLClassLoader這個類加載器;

并且還給出了所對應的主要關鍵詞是:

java.util.concurrent.ConcurrentHashMap$Node[]

java.util.concurrent.ConcurrentHashMap

org.springframework.boot.loader.LaunchedURLClassLoader @ 0x6000a6860

基本上可以說是很詳細了,一語中的,如果想要檢視明細,可以直接點選detail,裡面有更詳細的說明,如下圖所示:

Mat使用詳解背景Mat的作用Mat的使用步驟Overview下功能解釋一級導航欄功能說明常見溢出的幾個場景

上圖分别說明了到該記憶體洩漏的對象的最快路徑,也就是列出了目前ConcurrentHashMapConcurrentHashMap@0x60191cfa8這個對象所對應的被引用關系:可以看到目前引起記憶體洩漏的ConcurrentHashMap被CacheObjectBinaryProcessorImpl@0x60191cea8這個對象的metadataLocCache這個屬性所引用,而CacheObjectBinaryProcessorImpl這個對象又被GridKernalContextImpl @ 0x601821bf8這個對象的cacheObjeProc這個屬性所引用,以此遞推;

除此之外,還有以下三個被隐藏的資訊,點選即可檢視明細:

Accumulated Objects in Dominator Tree (主要樹中的累積對象),Accumulated Objects by Class in Dominator Tree(主要樹中的按類累積對象 ,All Accumulated Objects by Class (按類列出所有的累積對象)

Overview功能說明結尾

通過上述的解釋應該對目前Overview下的功能使用已經有了一個大概的了解,需要注意的是,Histogram 以及Dominator Tree時所主要提及的Shallow Size以及Retained Size以及在所列出的對象上右鍵檢視引用關系,GCROOTS,以及左上角所展示的屬性明細等功能 是适用于所有的功能子產品的,後續不再贅述;

一級導航欄功能說明

檢視完上述關于Overview中的功能說明後,此處再來看一下Overview中不包含的一些功能

Thread_Overview

如下圖所示,點選一級導航欄的第5個圖示,可以用來檢視目前程序dump時的所有線程的堆棧資訊,通過分析下面所對應的堆棧資訊,可以很快速的定位到對應的線程所執行的方法等層級關系,以此來定位對應的異常問題;

Mat使用詳解背景Mat的作用Mat的使用步驟Overview下功能解釋一級導航欄功能說明常見溢出的幾個場景

OQL

用于查詢Java堆的類SQL查詢語言

Mat使用詳解背景Mat的作用Mat的使用步驟Overview下功能解釋一級導航欄功能說明常見溢出的幾個場景

Heap Dump Overview

點選一級導航欄的第6個圖示的下拉框下的 Heap Dump Overview,可以檢視全局的記憶體占用資訊

Mat使用詳解背景Mat的作用Mat的使用步驟Overview下功能解釋一級導航欄功能說明常見溢出的幾個場景

Find Object by address

檢視指定記憶體位址所對應的對象資訊;

Mat使用詳解背景Mat的作用Mat的使用步驟Overview下功能解釋一級導航欄功能說明常見溢出的幾個場景

常見溢出的幾個場景

1、線程所引用對象溢出

2、靜态屬性對象溢出

線程棧所引用對象溢出的場景,如下:

Mat使用詳解背景Mat的作用Mat的使用步驟Overview下功能解釋一級導航欄功能說明常見溢出的幾個場景

Mat各功能内還有很多小的子功能,使用過程中可逐漸嘗試,此處不再贅述