栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【记系统频繁出现OOM(GC overhead limit exceeded)卡死的解决过程】

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【记系统频繁出现OOM(GC overhead limit exceeded)卡死的解决过程】

项目场景:

工程管理平台系统在高峰期出现OOM系统卡死


问题描述

工程管理平台系统在高峰期容易出现OOM(GC overhead limit exceeded)系统卡死,频率为一周2-3次,没有可用的日志分析,出现后都是重启。

GC overhead limit exceeded是当Java进程花费98%以上的时间执行GC,但只恢复了不到2%的内存,且该动作连续重复了5次,就会抛出java.lang.OutOfMemoryError:GC overhead limit exceeded错误。简单地说,就是应用程序已经基本耗尽了所有可用内存,GC也无法回收。


原因分析:

1、高峰期容易出现,那肯定是JVM内存在特定条件下会出现OOM
2、因为没有系统宕机而没有可用的日志分析,这点需要优化


解决方案:

1、对所有系统增加系统宕机时输出heapDump日志的参数
2、拿到了heapDump日志,通过jvim工具分析排查原因
3、分析后发现是excel导出大批量约3000张图片时,且在高峰期就会出现OOM,紧急优化该方法并排查其他类似场景
4、优化前大对象在整个导出会占用30多秒,优化后将其占用时间优化为2-3秒,并且相应的增加JVM内存

针对第4点补充下实现方案:优化前导出功能是先查询出3000条数据,再编辑每条数据拿到图片URL,然后先将3000张图片下载后转为byte字节放在数组,这个阶段需要30秒,且大量图片组成的大对象一直在JAVA内存里,所以优化后先多线程去下载到本地,这样就可以释放对象内存,优化了大对象存活时间过程,然后再从本地快速读取导出,这个阶段需要2-3秒,所以最终大对象存活时间过程为2-3秒。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/888304.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号