1. 程式人生 > >利用MAT分析JVM記憶體問題,從入門到精通(二)

利用MAT分析JVM記憶體問題,從入門到精通(二)

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

三、歡迎頁

使用MAT開啟一個heap dump檔案,解析完成後,預設會進入歡迎頁,歡迎頁裡包含了一些常見的分析:最大記憶體佔用分析、常見的分析動作、常用的分析報告、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集合的碰撞率等等。

四、基本功能

關於概覽頁面,我們再上一節已經進行過分析,這裡不再贅述。我們在這一小節,將重點放在功能欄那一欄,即類直方圖、支配樹、OQL查詢、執行緒檢視等功能。

4.1 類直方圖

堆直方圖是從類的角度看哪些類及該類的例項物件佔用著記憶體情況,預設是按照某個類的shallow heap大小從大到小排序。

Retained Heap這一列的值是空的,因為對於某個類的所有例項計算總的retained heap非常慢,因此使用者需要按需計算。

在直方圖頁面,可以選擇某個條目右鍵進行分析,例如對所有類的物件做一些分析動作。

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

如果選擇按照package來分類,則可以看到下面這種檢視

4.2 支配樹

支配樹可以用於檢視heap dump中佔用記憶體最大的物件。在支配樹中,對於某一層的節點來說,如果它們的parent節點沒有被其他物件引用了,那麼這寫節點都會被垃圾收集器回收。

支配樹可以用來排查是哪些物件導致了其他物件無法被垃圾收集器回收,跟類直方圖類似,支配樹也從類載入器、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物件的語句和結果:

4.4 執行緒檢視

通過上圖中的那個按鈕,可以檢視執行緒檢視,執行緒檢視首先給出了在生成快照那個時刻,JVM中的Java執行緒物件列表。這個按鈕的功能,等同於下圖中的這個操作:

線上程檢視這個表中,可以看到以下幾個資訊:執行緒物件的名字、執行緒名、執行緒物件佔用的堆記憶體大小、執行緒物件的保留堆記憶體大小、執行緒的上下文載入器、是否為守護執行緒。

選中某個執行緒物件展開,可以看到執行緒的呼叫棧和每個棧的區域性變數,通過檢視執行緒的呼叫棧和區域性變數的記憶體大小,可以找到在哪個呼叫棧裡分配了大量的記憶體。

因此,heap dump和MAT不僅僅用於排查記憶體相關的問題,也有助於排查執行緒相關的問題。

4.5 問題分析


上圖中的這個按鈕,是MAT提供的一些常見的問題分析能力。因為這些問題特別常見,所以MAT就提供了對應的組合功能,幫使用者快速定位常見問題。

  1. Heap Dump Overview
    Heap Dump Overview就是整個堆的概括情況,例如:堆記憶體大小、物件個數、類的個數、類載入器的個數、GC root的個數、堆記憶體檔案的格式、檔案的建立時間、位置等資訊。這個頁面還開一個看一些系統屬性、執行緒概覽、Top記憶體耗費元件、類直方圖等資訊。

  2. Leak Suspects
    如下圖所示,這個功能用於排查潛在的記憶體洩漏問題。

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

這一系列的分析,有很多層次,可以用下面這張思維導圖理解:

4.6 物件查詢

MAT支援根據物件的十六進位制地址查詢物件的outbound引用檢視,如下圖所示:

這個功能等同於在直方圖中選中某個物件,然後右鍵列舉該物件的outbound引用檢視:


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

相關推薦

利用MAT分析JVM記憶體問題入門精通

上一篇文章MAT入門到精通(一)介紹了MAT的使用場景和基本概念,這篇文章開始介紹MAT的基本功能,後面還有兩篇,一篇是MAT的高階功能,另一篇是MAT實戰案例分析。 三、歡迎頁 使用MAT開啟一個heap dump檔案,解析完成後,預設會進入歡迎頁,歡迎頁裡包含了一些常見的分析:最大記憶體佔用分析、常見的分

GAN網路入門教程之GAN原理

在一篇部落格[GAN網路從入門教程(一)之GAN網路介紹](https://www.cnblogs.com/xiaohuiduan/p/13237486.html)中,簡單的對GAN網路進行了一些介紹,介紹了其是什麼,然後大概的流程是什麼。 在這篇部落格中,主要是介紹其數學公式,以及其演算法流程。當然數學公

TensorFlow 入門精通:MNIST 例程原始碼分析

按照上節步驟, TensorFlow 預設安裝在 /usr/lib/python/site-packages/tensorflow/ (也有可能是 /usr/local/lib……)下,檢視目錄結構: # tree -d -L 3 /usr/lib/pyt

rnn到lstm再到seq2seq

app 感受 ima bsp expand images cat https github 從圖上可以看出來,decode的過程其實都是從encode的最後一個隱層開始的,如果encode輸入過長的話,會丟失很多信息,所以設計了attation機制。 attati

【SpringMVC架構】SpringMVC入門實例解析工作原理

rip 業務邏輯層 popu 輸入 implement override article hide -i 上篇博文,我們簡單的介紹了什麽是SpringMVC。這篇博文。我們搭建一個簡單SpringMVC的環境,使用非註解形式實現一個HelloWorld實

反射入門精通

char tostring import host res substring bject getc i++ 1. 通過反射動態生成SQL語句 Customer.java package com.xuzhiwen.reflect; public class Custom

[深度學習]實現一個博弈型的AI五子棋開始1

com class svm 顏色 display 深度 images += have 好久沒有寫過博客了,多久,大概8年???最近重新把寫作這事兒撿起來……最近在折騰AI,寫個AI相關的給團隊的小夥伴們看吧。 搞了這麽多年的機器學習,從分

python-類-入門精通

0.本文內容--繼承 在上一篇部落格中,講述了python3類的基本使用方法,本篇部落格著重介紹類的繼承特性。 在編寫類的時候,我們不一定都要從空白開始。如果我們正在編寫的類,實際上是另外一個已經存在的類的特殊版本,那麼我們就可以使用類的繼承。B類繼承A類後,B類將自動獲取A類的所有屬性和方

linux入門學習:linux圖形化界面與命令行界面之間的切換以及一些系統命令

之間 linu 鏡像 pan ctr 安裝 linux -- linux鏡像 一、linux圖形化界面與命令行界面之間的切換 註意:前提是你安裝的 linux鏡像ios 必須具備圖形化功能。 1)  圖形化界面--->命令行界面:       ctrl + alt +

JVM記憶體分配與回收學習2

1、垃圾收集器什麼時候開始回收? (1)新生代有一個Eden區和兩個survivor區(From survivor 和To Survivor),每次使用Eden和其中一個Survivor(From Survivor),建立物件時,首先會將物件放入Eden區,如果放不下就會引發一次發生在新生代

設計一個 Java 程式自定義異常類命令列鍵盤輸入一個字串如果該字串值為“XYZ”。。。

設計一個 Java 程式,自定義異常類,從命令列(鍵盤)輸入一個字串,如果該字串值為“XYZ”,則丟擲一個異常資訊“This is a XYZ”,如果從命令列輸入 ABC,則沒有丟擲異常。(只有 XYZ 和 ABC 兩種輸入)。 class xyz {   public void test(S

Matlab入門精通

1、數值的記述 3 -98 0.002 9.88 1.4e-3 4.99e23 2、變數命名規則       &

從新撿起c++stl開始1

容器包括關聯容器和順序容器。 關聯容器是通過鍵(key)儲存和讀取元素的,而順序容器則通過元素在容器中的位置順序儲存和訪問元素。 順序容器包括:vector  list  deque等,vector是表示一串連續的記憶體地址,基於陣列實現.   list是不連續的記憶體地

從新撿起c++stl開始2

list: list類似於連結串列,它的儲存空間不是連續的,但是可以快速的插入和刪除,但是隨機訪問比較慢。 assign() 給list賦值        back()返回最後一個元素          begin()返回指向第一個元素的迭代器 clear() 清空li

springboot入門精通

這一節我們一起用springboot開發一個應用程式,應用程式裡的核心概念是玩家獲取英雄列表上的英雄資訊。 1、定義實體模型: 程式碼如下: package com.dota.herolist.entity; import javax.persistence.Entity;import javax.p

python爬蟲"Hello World"級入門例項,使用json中國天氣網抓取資料

一、二話不說先上程式碼 python2.7版 #!/usr/bin/python2.7 #-*- coding=UTF-8 -*- import urllib import json def get_dic(url): page = urll

學習Qt之基礎篇——入門開始1

Qt 簡介         Qt是一個跨平臺的C++應用程式開發框架,被廣泛用於開發GUI程式。 Qt有豐富的 API且面向物件。Qt是自由且開放原始碼的軟體,在GNU較寬鬆公共許可證條款下發布。支援廣泛的編譯器,包括GCC的C++編譯器和Visual Studio。 Q

Android開發中ConstraintLayout的使用入門精通

上一片部落格中介紹了ConstraintLayout 佈局中的約束的原理以及如何使用,現在我們知道在ConstraintLayout 中如何控制一個檢視的位置,接下來分享一下在ConstraintLayout 中如何控制檢視的大小。 在ConstraintLayout 中控制檢視大小有三

matlab入門精通matlab語言基礎

1.變數與常量 變數名的組成:與C語言類似:下劃線,字母,數字,開頭必須為下劃線或字母 變數的初始化:(1)=  賦值(2)input(‘提示’) 與C語言區別可以不用初始化,直接賦值 常見常量: i

python資料分析pandas包入門學習基本功能

本文參考《利用Python進行資料分析》的第五章 pandas入門 2基本功能 介紹操作Series和DataFrame中的資料的基本手段。 重新索引reindex 當呼叫Series的reindex將會根據新索引進行重排;當某個索引值當前不存在,就引入缺失值;fill_