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

日志分析??梢钥闯?,存在兩個(gè)較大的問題,每個(gè)大約占用1G的空間

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



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


總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java數(shù)據(jù)結(jié)構(gòu)及算法實(shí)例:漢諾塔問題 Hanoi
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)及算法實(shí)例:漢諾塔問題 Hanoi,本文直接給出實(shí)現(xiàn)代碼,代碼中包含大量注釋,需要的朋友可以參考下2015-06-06
Java實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問題與讀者寫者問題詳解
這篇文章主要介紹了Java實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問題與讀者寫者問題詳解,小編覺得挺不錯(cuò)的,這里分享給大家,供需要的親朋好友參考。2017-11-11
SpringMVC源碼之HandlerMapping處理器映射器解析
這篇文章主要介紹了SpringMVC源碼之HandlerMapping處理器映射器解析,在Spring?MVC中,HandlerMapping處理器映射器用于確定請(qǐng)求處理器對(duì)象,請(qǐng)求處理器可以是任何對(duì)象,只要它們使用了@Controller注解或注解@RequestMapping,需要的朋友可以參考下2023-08-08
Java實(shí)現(xiàn)斗地主最簡代碼實(shí)例
在本篇文章里小編給各位分享的是關(guān)于Java實(shí)現(xiàn)斗地主最簡代碼實(shí)例,有興趣的朋友們可以參考下。2020-05-05
Spring動(dòng)態(tài)多數(shù)據(jù)源配置實(shí)例Demo
本篇文章主要介紹了Spring動(dòng)態(tài)多數(shù)據(jù)源配置實(shí)例Demo,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01
SLF4J報(bào)錯(cuò)解決:No SLF4J providers were found的
這篇文章主要介紹了SLF4J報(bào)錯(cuò)解決:No SLF4J providers were found的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
Java通過動(dòng)態(tài)代理實(shí)現(xiàn)一個(gè)簡單的攔截器操作
這篇文章主要介紹了Java通過動(dòng)態(tài)代理實(shí)現(xiàn)一個(gè)簡單的攔截器操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
java中ImageReader和BufferedImage獲取圖片尺寸實(shí)例
這篇文章主要介紹了java中ImageReader和BufferedImage獲取圖片尺寸實(shí)例,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01

