java.lang.OutOfMemoryError内存泄露 代码定位及优化

问题现象:
20并发登录系统户,刚开始所有指标正常,压测10分钟左右后,页面报java.lang.OutOfMemoryError,系统无法登陆,脚本无法正常压测,出现内存泄露,如图:


 

监控分析:
查看到应用服务器CPU一致持续97%以上,
监控JVM,堆内存每次回收不彻底,无法正常释放,持续加压下heap内存消耗完,最终导致服务宕掉,无法访问系统页面。可确定,代码存在内存泄露
如图红色箭头为处为20并发压测系统的现象:


  

优化解决:
①、先手动配置参数,调整heap区大小:
JAVA_OPTS="-server
 -Xms2048m -Xmx2048m -XX:PermSize=128M -XX:MaxNewSize=512m -XX:MaxPermSize=256m -XX:-UseGCOverheadLimit"


②、dump出20并发下导致系统内存泄露信息,利用EclipseMAT对线程代码进行分析,如图红圈处导致内存泄露代码相关信息:


 



需要开发优化此处代码(开发优化为:登陆模块移除缓存设置,改用系统启动加载一次 ),
优化的代码如下:
EHCacheUtil.initCacheManager();  
        EHCacheUtil.initCache("pubthlpcache"); 
        Pubthlp pubthlp=new Pubthlp();
        List<Pubthlp> pubthlpList = pubthlpService.getPubthlpListByObj(pubthlp);
        
        EHCacheUtil.put("cacheList", pubthlpList);

这个缓存 每次new 都很消耗java JVM内存,压力测试每次都new  内存有限的情况下直接内存泄露
优化该代码:去掉缓存每次new

优化代码后:
重新执行20并发压测,内存泄露问题解决,服务器CPU利用正常,监控JVM heap消耗及垃圾回收正常,系统登录操作正常,如图:


GC频率快,还需分析调整JVM参数

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值