java内存占用过大分析,mat内存快照分析

背景

最近功能模块上线后,生产内存占用显著提升,查看gc日志发现年轻代频繁从2G回收到60M左右,猜测是在方法中频繁创建大对象导致,由于一时间无法通过review代码找出问题所在,只好将生产jvm内存快照dump后通过java memory analyzer tool进行分析。

介绍

MAT(java memory analyzer tool)是一款基于eclipse免费开源的java内存分析工具,可以用来分析java堆栈溢出,大对象排查等。

下载安装

https://www.eclipse.org/mat/previousReleases.php

使用

  1. 前往服务器dump出jvm内存快照
    命令:jmap -dump:all,format=b,file={快照保存文件名}.hprof {应用pid},dump:all表示dump出所有对象,如jmap -dump:all,format=b,file=jvmall.hprof 3314
  2. 修改mat jvm参数,增加最大堆内存,避免打开大快照出现oom问题
    在这里插入图片描述
    在这里插入图片描述
  3. 打开mat软件,进行自定义设置
    在这里插入图片描述
    设置保留不可达对象,对象占用内存单位根据大小自动按照byte/mb等显示
    在这里插入图片描述
  4. 选择dump出来的jvm快照
    依次点击file -> open heap dump
    在这里插入图片描述
    选择泄露检查,点击完成,等待快照加载完毕
    在这里插入图片描述
    点击查看对象柱状图
    在这里插入图片描述
    根据对象存在堆中的大小进行排序
    在这里插入图片描述
    右键查看大对象集合的引用情况
    在这里插入图片描述
    再次按照对象大小进行排序查看,找到大对象的引用关系,由于有的大对象的引用已被gc回收,因此无法找到具体的引用根节点,需要我们手动筛选下。
    在这里插入图片描述
    从上图可以看出,堆中存在大量base64编码的图片字符串大对象,通过引用关系可以定位到引用到这些大对象的model类,再结合代码最终解决问题。
  5. 修改mat设置后(如从保留不可达对象到只分析可达对象),需要删除上次打开生成的分析文件,再重新启动mat
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值