使用MAT進行JVM內(nèi)存分析實例
背景描述
公司小程序商城項目,服務(wù)器為阿里云。
前段時間總是出現(xiàn)服務(wù)器CPU報警現(xiàn)象(設(shè)置的閾值為95%,CPU使用率大于95%會自動報警)。
通過占用命令查看,迅速鎖定當前運行的java進程。
基礎(chǔ)知識
MAT簡介
Eclipse Memory Analyzer是一個快速且功能豐富的Java堆分析器,可幫助您查找內(nèi)存泄漏并減少內(nèi)存消耗。
使用Memory Analyzer分析具有數(shù)億個對象的高效堆轉(zhuǎn)儲,快速計算對象的保留大小,查看誰阻止垃圾收集器收集對象,運行報告以自動提取泄漏嫌疑者。
Heap Dump
首先了解下Heap Dump,它也叫堆轉(zhuǎn)儲文件,是java進程在某個時間內(nèi)的快照。
它在觸發(fā)快照的時候保存了很多信息:java對象和類信息。
通常在寫Heap Dump文件前會觸發(fā)一次Full GC。
獲取Dump
- 通過OOM獲取,即在OutOfMemoryError后獲取一份HPROF二進制Heap Dump文件,可以在jvm里添加參數(shù):
- 通過OOM獲取,即在OutOfMemoryError后獲取一份HPROF二進制Heap Dump文件,可以在jvm里添加參數(shù):
- -XX:+HeapDumpOnOutOfMemoryError
- 主動獲取,即在虛擬機添加參數(shù)如下,然后在Ctrl+Break組合鍵即可獲取一份Heap Dump
- -XX:+HeapDumpOnCtrlBreak
- 使用HPROF agent
- 使用Agent可以在程序執(zhí)行結(jié)束時或受到SIGOUT信號時生成Dump文件。配置在虛擬機的參數(shù)如下:
- -agentlib:hprof=heap=dump,format=b
- jmap 可以在cmd里執(zhí)行,命令如下:
- jmap -dump:format=b file=<文件名XX.hprof>
- 使用JConsole
分析實戰(zhàn)
首先獲取dump,jmap -dump:format=b file=<文件名XX.hprof>
使用MAT工具進行日志解析,根據(jù)日志的大小不同,解析時間不同。File>Open Heap Dump。

日志分析。可以看出,存在兩個較大的問題,每個大約占用1G的空間

查看Problem Suspect 1的詳細信息、線程的樹結(jié)構(gòu)以及線程對象匯總,發(fā)現(xiàn)Member對象有近52萬個存活對象



分析線程棧信息,定位問題發(fā)生位置,并進行方法優(yōu)化


總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java Springboot之Spring家族的技術(shù)體系
今天帶大家來學習Spring家族的技術(shù)體系,文中有非常詳細的圖文介紹及代碼示例,對正在學習java的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05
springboot整合ehcache和redis實現(xiàn)多級緩存實戰(zhàn)案例
這篇文章主要介紹了springboot整合ehcache和redis實現(xiàn)多級緩存實戰(zhàn)案例,從源碼角度分析下多級緩存實現(xiàn)原理,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2023-08-08
SpringData JPA快速上手之關(guān)聯(lián)查詢及JPQL語句書寫詳解
JPA都有SpringBoot的官方直接提供的starter,而Mybatis沒有,直到SpringBoot 3才開始加入到官方模版中,這篇文章主要介紹了SpringData JPA快速上手,關(guān)聯(lián)查詢,JPQL語句書寫的相關(guān)知識,感興趣的朋友一起看看吧2023-09-09

