利用MAT分析JVM內存問題,從入門到精通(二)

上一篇文章MAT入門到精通(一)介紹了MAT的使用場景和基本概念,這篇文章開始介紹MAT的基本功能,後面還有兩篇,一篇是MAT的高級功能,另外一篇是MAT實戰案例分析。java

3、歡迎頁

使用MAT打開一個heap dump文件,解析完成後,默認會進入歡迎頁,歡迎頁裏包含了一些常見的分析:最大內存佔用分析、常見的分析動做、經常使用的分析報告、MAT使用教程等等。面試

咱們看下下面這張圖,能夠看出MAT的主要結構和功能: 數據庫

MAT的窗口布局

  1. inspector:透視圖,用於展現一個對象的詳細信息,例如內存地址、加載器名稱、包名、對象名稱、對象所屬的類的父類、對象所屬的類的加載器對象、該對象的堆內存大小和保留大小,gc root信息。
  2. inspector窗口的下半部分是展現類的靜態屬性和值、對象的實例屬性和值、對象所屬的類的繼承結構。
  3. Heap Dump History:用於列舉最近分析過的文件
  4. 經常使用功能欄,從左到右依次是:概覽、類直方圖、支配樹、OQL查詢、線程視圖、報告相關、詳細功能。其中概覽就是在剛解析完後展現的這個頁面,詳細功能按鈕則是提供了一些更細緻的分析能力。
  5. 概覽中的餅圖:該餅圖用於展現retained size最大的對象
  6. 經常使用的分析動做:類直方圖、支配樹、按照類和包路徑獲取消耗資源最多的對象、重名類。
  7. 報告相關:Leak Suspects用於查找內存泄漏問題,以及系統概覽
  8. Components Report:這個功能是一組功能的集合,用於分析某一類性的類的實例的問題,例如分析java.util.*開頭的類的實例對象的一些使用狀況,例如:重複字符串、空集合、集合的使用率、軟引用的統計、finalizer的統計、Map集合的碰撞率等等。
    Component Report的功能

4、基本功能

關於概覽頁面,咱們再上一節已經進行過度析,這裏再也不贅述。咱們在這一小節,將重點放在功能欄那一欄,即類直方圖、支配樹、OQL查詢、線程視圖等功能。express

4.1 類直方圖

堆直方圖是從類的角度看哪些類及該類的實例對象佔用着內存狀況,默認是按照某個類的shallow heap大小從大到小排序。後端

類直方圖

Retained Heap這一列的值是空的,由於對於某個類的全部實例計算總的retained heap很是慢,所以使用者須要按需計算。 bash

retained size是按需計算

在直方圖頁面,能夠選擇某個條目右鍵進行分析,例如對全部類的對象作一些分析動做。編輯器

image.png

在直方圖頁面,還有一個重要的特性——能夠選擇一些其餘維度進行分類分析,例如superclass、class loader、package。佈局

image.png

若是選擇按照package來分類,則能夠看到下面這種視圖優化

image.png

4.2 支配樹

支配樹能夠用於查看heap dump中佔用內存最大的對象。在支配樹中,對於某一層的節點來講,若是它們的parent節點沒有被其餘對象引用了,那麼這寫節點都會被垃圾收集器回收。spa

支配樹能夠用來排查是哪些對象致使了其餘對象沒法被垃圾收集器回收,跟類直方圖相似,支配樹也從類加載器、package等角度來看。

[圖片上傳失敗...(image-ec386f-1550075801691)]

4.3 OQL查詢

MAT提供另外一種相似SQL的對象查詢語言——OQL,能夠用相似SQL語句的方式查詢heap dump中的對象。OQL和關係型數據庫具有相似的數據模型:將某個類看做是一張表,將該類的實例對象看做是該表中的行,每一個對象中的屬性看做是構成行的列。

OQL語言的語法結構以下:

SELECT *
FROM [ INSTANCEOF ] <class name="name">
[ WHERE <filter-expression> ]
</filter-expression></class>
複製代碼

OQL編輯器分爲兩個區域:

  • 上半部分的區域用於輸入查詢語句
  • 下半部分的區域用於展現查詢語句執行的結果

下圖是查詢當前堆裏全部的String對象的語句和結果:

image.png

4.4 線程視圖

image.png

經過上圖中的那個按鈕,能夠查看線程視圖,線程視圖首先給出了在生成快照那個時刻,JVM中的Java線程對象列表。這個按鈕的功能,等同於下圖中的這個操做:

image.png

在線程視圖這個表中,能夠看到如下幾個信息:線程對象的名字、線程名、線程對象佔用的堆內存大小、線程對象的保留堆內存大小、線程的上下文加載器、是否爲守護線程。

選中某個線程對象展開,能夠看到線程的調用棧和每一個棧的局部變量,經過查看線程的調用棧和局部變量的內存大小,能夠找到在哪一個調用棧裏分配了大量的內存。

image.png

所以,heap dump和MAT不只僅用於排查內存相關的問題,也有助於排查線程相關的問題。

4.5 問題分析

image.png
上圖中的這個按鈕,是MAT提供的一些常見的問題分析能力。由於這些問題特別常見,因此MAT就提供了對應的組合功能,幫用戶快速定位常見問題。

  1. Heap Dump Overview Heap Dump Overview就是整個堆的歸納狀況,例如:堆內存大小、對象個數、類的個數、類加載器的個數、GC root的個數、堆內存文件的格式、文件的建立時間、位置等信息。這個頁面還開一個看一些系統屬性、線程概覽、Top內存耗費組件、類直方圖等信息。

    image.png

  2. Leak Suspects 以下圖所示,這個功能用於排查潛在的內存泄漏問題。

    image.png

  3. Top Components 針對那些佔用堆內存超過整個堆內存1%大小的組件作一系列的分析,例如:Top Consumers、保留集合、潛在的內存浪費問題等其餘問題。

    image.png

這一系列的分析,有不少層次,能夠用下面這張思惟導圖理解:

image.png

4.6 對象查找

MAT支持根據對象的十六進制地址查找對象的outbound引用視圖,以下圖所示:

image.png

這個功能等同於在直方圖中選中某個對象,而後右鍵列舉該對象的outbound引用視圖:

image.png


本號專一於後端技術、JVM問題排查和優化、Java面試題、我的成長和自我管理等主題,爲讀者提供一線開發者的工做和成長經驗,期待你能在這裏有所收穫。

javaadu
相關文章
相關標籤/搜索