工程管理平台系统在高峰期出现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秒。



