【内存泄露排查】应用内存分析方案,采用jmap命令dump内存数据采样后,eclipse mat插件分析

JVM内存溢出排查实例

问题简介

应用上线一段时间后,出现过两次运行很慢的情况,大约间隔1~2周(中间有小发布会重启应用,不能断定问题出现频率是1~2周),通过jstat –gc pid interval count查看对应的进程,看到FULL GC次数一直增长,初步判断为内存溢出问题。

保存现场

使用jmap将内存信息dump出来,语法如下:
jmap -dump:format=b,file=heap.hprof pid

分析内存

  1. 将dump出来的内存文件heap.hprof拷贝至本机,用Eclipse MAT插件打开。文件较大,第一次打开时需要几分钟进行分析计算,如果出身计算错误,报heap内存不够,此时需要增加eclipse的内存,配置文件位置为eclipse目录下的eclipse.ini文件;导入后的情况如下图所示:

  1. 查看大对象。点击图示下方的"Top Consumers"查看大对象,如下图所示:

  1. 查看具体对象。点击出下图所示的弹出菜单查看具体对象;


可以看到对象为com.ali.kepler.dal.dao.vo.AoneProject

  1. 查找源码。从源代码中,找出对AoneProject对象的引用,所有引用中,除了BuildHistoryPrepare之外,其它的引用均是使用了分页参数进行查询,如下图所示:

  1. 分析源码。重点分析BuildHistoryPrepare.getAoneProjectByCrid(String crid)方法


这个方法没有对crid进行非空判断,因此当crid为空时,将进行全表扫瞄,而且没有进行分页参数设置,所以最终导致内存泄漏

  1. 重现问题

在单元测试历史构建列表页面中,url地址栏键入回车键:

可以看到内存迅速增长,直至内存溢出

  1. 解决问题
  2. crid必须加入非空判断;
  3. AoneProjectDaoImpl中查询时,如果没有传入分页参数,加入分页参数;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值