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

来源:互联网 发布:唯品会与淘宝的区别 编辑:程序博客网 时间:2024/05/02 02:32

问题现象:
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 0
原创粉丝点击