1、问题
*在业务场景里,会出现高峰期大量业务人员导出报表,然后就出现了系统的某个RPC服务直接挂掉。
下载了dump日志进行分析后发现,调用导出报表接口会出现内存满,频繁触发full gc(大约10-15次)。
2、 分析
1、从内部的指标分析软件可以看出,调用这个接口是及其耗内存,且gc的时间和次数都有大的增长;
老年代增长到6G,且无法回收;年轻代的分配和回收保持正常。
初步怀疑是大对象直接分配到老年代造成的。
2、然后我们控制了线程数进行测试,排出了高QPS请求打进来的原因,进一步确定是大对象造成的内存耗尽,从而引起full gc
3、最后使用jvisualvm对dump文件进行解析,发现大部分内存都被excel文件占用,确认了我们的猜想
3 解决
导出功能使用了poi的包,该包有常见的耗内存问题,这个问题我们想到了三种解法 1、优化poi实现方式 2、切换阿里的easyExcel 3、导出excel改为导出csv 最后由于是种种原因,我们选择了第一套方案
poi占内存是本身固有问题,一般xls使用HSSFWorkbook,xlsx使用XSSFWorkbook 为了改进内存多的问题,poi提供了SXSSFWorkbook,即流式XSSFWorkbook,可以限定内存中的数据量 使用SXSSFWorkbook进行导出的时候,可以限定内存中的数据行数,减少内存占用