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里添加参数:
    -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

分析实战

  1. 首先获取dump,jmap -dump:format=b file=<文件名XX.hprof>
  2. 使用MAT工具进行日志解析,根据日志的大小不同,解析时间不同。File>Open Heap Dump。
    在这里插入图片描述
  3. 日志分析。可以看出,存在两个较大的问题,每个大约占用1G的空间
    在这里插入图片描述
  4. 查看Problem Suspect 1的详细信息、线程的树结构以及线程对象汇总,发现Member对象有近52万个存活对象
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  5. 分析线程栈信息,定位问题发生位置,并进行方法优化
    在这里插入图片描述
    在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值