使用MAT进行JVM内存分析实例
背景描述
公司小程序商城项目,服务器为阿里云。
前段时间总是出现服务器CPU报警现象(设置的阈值为95%,CPU使用率大于95%会自动报警)。
通过占用命令查看,迅速锁定当前运行的java进程。
基础知识
MAT简介
Eclipse Memory Analyzer是一个快速且功能丰富的Java堆分析器,可帮助您查找内存泄漏并减少内存消耗。
使用Memory Analyzer分析具有数亿个对象的高效堆转储,快速计算对象的保留大小,查看谁阻止垃圾收集器收集对象,运行报告以自动提取泄漏嫌疑者。
Heap Dump
首先了解下Heap Dump,它也叫堆转储文件,是java进程在某个时间内的快照。
它在触发快照的时候保存了很多信息:java对象和类信息。
通常在写Heap Dump文件前会触发一次Full GC。
获取Dump
- 通过OOM获取,即在OutOfMemoryError后获取一份HPROF二进制Heap Dump文件,可以在jvm里添加参数:
- 通过OOM获取,即在OutOfMemoryError后获取一份HPROF二进制Heap Dump文件,可以在jvm里添加参数:
- -XX:+HeapDumpOnOutOfMemoryError
- 主动获取,即在虚拟机添加参数如下,然后在Ctrl+Break组合键即可获取一份Heap Dump
- -XX:+HeapDumpOnCtrlBreak
- 使用HPROF agent
- 使用Agent可以在程序执行结束时或受到SIGOUT信号时生成Dump文件。配置在虚拟机的参数如下:
- -agentlib:hprof=heap=dump,format=b
- jmap 可以在cmd里执行,命令如下:
- jmap -dump:format=b file=<文件名XX.hprof>
- 使用JConsole
分析实战
首先获取dump,jmap -dump:format=b file=<文件名XX.hprof>
使用MAT工具进行日志解析,根据日志的大小不同,解析时间不同。File>Open Heap Dump。
日志分析。可以看出,存在两个较大的问题,每个大约占用1G的空间
查看Problem Suspect 1的详细信息、线程的树结构以及线程对象汇总,发现Member对象有近52万个存活对象
分析线程栈信息,定位问题发生位置,并进行方法优化
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341