上一篇文章MAT入門到精通(一)介紹了MAT的使用場景和基本概念,這篇文章開始介紹MAT的基本功能,後面還有兩篇,一篇是MAT的高級功能,另外一篇是MAT實戰案例分析。java
使用MAT打開一個heap dump文件,解析完成後,默認會進入歡迎頁,歡迎頁裏包含了一些常見的分析:最大內存佔用分析、常見的分析動做、經常使用的分析報告、MAT使用教程等等。面試
咱們看下下面這張圖,能夠看出MAT的主要結構和功能: 數據庫
java.util.*
開頭的類的實例對象的一些使用狀況,例如:重複字符串、空集合、集合的使用率、軟引用的統計、finalizer的統計、Map集合的碰撞率等等。
關於概覽頁面,咱們再上一節已經進行過度析,這裏再也不贅述。咱們在這一小節,將重點放在功能欄那一欄,即類直方圖、支配樹、OQL查詢、線程視圖等功能。express
堆直方圖是從類的角度看哪些類及該類的實例對象佔用着內存狀況,默認是按照某個類的shallow heap大小從大到小排序。後端
Retained Heap這一列的值是空的,由於對於某個類的全部實例計算總的retained heap很是慢,所以使用者須要按需計算。 bash
在直方圖頁面,能夠選擇某個條目右鍵進行分析,例如對全部類的對象作一些分析動做。編輯器
在直方圖頁面,還有一個重要的特性——能夠選擇一些其餘維度進行分類分析,例如superclass、class loader、package。佈局
若是選擇按照package來分類,則能夠看到下面這種視圖優化
支配樹能夠用於查看heap dump中佔用內存最大的對象。在支配樹中,對於某一層的節點來講,若是它們的parent節點沒有被其餘對象引用了,那麼這寫節點都會被垃圾收集器回收。spa
支配樹能夠用來排查是哪些對象致使了其餘對象沒法被垃圾收集器回收,跟類直方圖相似,支配樹也從類加載器、package等角度來看。
[圖片上傳失敗...(image-ec386f-1550075801691)]
MAT提供另外一種相似SQL的對象查詢語言——OQL,能夠用相似SQL語句的方式查詢heap dump中的對象。OQL和關係型數據庫具有相似的數據模型:將某個類看做是一張表,將該類的實例對象看做是該表中的行,每一個對象中的屬性看做是構成行的列。
OQL語言的語法結構以下:
SELECT *
FROM [ INSTANCEOF ] <class name="name">
[ WHERE <filter-expression> ]
</filter-expression></class>
複製代碼
OQL編輯器分爲兩個區域:
下圖是查詢當前堆裏全部的String對象的語句和結果:
經過上圖中的那個按鈕,能夠查看線程視圖,線程視圖首先給出了在生成快照那個時刻,JVM中的Java線程對象列表。這個按鈕的功能,等同於下圖中的這個操做:
在線程視圖這個表中,能夠看到如下幾個信息:線程對象的名字、線程名、線程對象佔用的堆內存大小、線程對象的保留堆內存大小、線程的上下文加載器、是否爲守護線程。
選中某個線程對象展開,能夠看到線程的調用棧和每一個棧的局部變量,經過查看線程的調用棧和局部變量的內存大小,能夠找到在哪一個調用棧裏分配了大量的內存。
所以,heap dump和MAT不只僅用於排查內存相關的問題,也有助於排查線程相關的問題。
Heap Dump Overview Heap Dump Overview就是整個堆的歸納狀況,例如:堆內存大小、對象個數、類的個數、類加載器的個數、GC root的個數、堆內存文件的格式、文件的建立時間、位置等信息。這個頁面還開一個看一些系統屬性、線程概覽、Top內存耗費組件、類直方圖等信息。
Leak Suspects 以下圖所示,這個功能用於排查潛在的內存泄漏問題。
Top Components 針對那些佔用堆內存超過整個堆內存1%大小的組件作一系列的分析,例如:Top Consumers、保留集合、潛在的內存浪費問題等其餘問題。
這一系列的分析,有不少層次,能夠用下面這張思惟導圖理解:
MAT支持根據對象的十六進制地址查找對象的outbound引用視圖,以下圖所示:
這個功能等同於在直方圖中選中某個對象,而後右鍵列舉該對象的outbound引用視圖:
本號專一於後端技術、JVM問題排查和優化、Java面試題、我的成長和自我管理等主題,爲讀者提供一線開發者的工做和成長經驗,期待你能在這裏有所收穫。