催收案件发布Excel文件上传并解析接口并发100出现内存溢出案例

POST /debtorder/debt/uploadExcel

30个并发压测就会出现5302服务宕机

 

 

 

 

问题主要是出现在excel文件解析上,即使excel文件中只有一条记录,也会出现OOM

由于采用的是POI解析文件,EXCEL解析的时候内存占用太大,容易导致内存溢出,所以优化后,采用阿里的easyexcel

POI百万级大数据量EXCEL导出 采用了分批查询数据来避免内存溢出和使用SXSSFWorkbook方式缓存数据到文件上以解决下载大文件EXCEL卡死页面的问题。

不过一是存在封装不太友好使用不方便的问题,二是这些poi的操作方式仍然存在内存占用过大的问题,三是存在空循环和整除的时候数据有缺陷的问题,以及存在内存溢出的隐患。

阿里开源的EasyExcel框架,可以将解析的EXCEL的内存占用控制在KB级别,并且绝对不会内存溢出(内部实现待研究),还有就是速度极快, 大概100W条记录,十几个字段, 只需要70秒即可完成下载

 

Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,

但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,能够原本一个3M的excel用POI sax依然需要100M左右内存降低到KB级别,

并且再大的excel不会出现内存溢出,03版依赖POI的sax模式。在上层做了模型转换的封装,让使用者更加简单方便

优化后:

但是还是无法支撑高并发,目前30个并发就不会报错,但是40并发就会出错

但是老年代还是频繁的回收GC,同时接口的耗时也比较严重,上述测试的案例,是一个excel中有50条记录

 

 

问题解决以后:

50条记录的excel在50并发下上传,响应时间基本控制在1s以内

 

主要优化点:

这个sql优化

ALTER  TABLE  `t_organization_auth`  ADD  INDEX idx_orgId ( `orgId` )

 

 

优化2:将poi解析框架替换成easyexcel矿建

优化3:复杂4表联合优化成单标查询

优化4:增加jvm内存到从2g到3g和6g

 

50并发条件

 

posted @ 2019-08-14 15:58  Agoly  阅读(175)  评论(0编辑  收藏  举报