【POI】大批量数据导出OOM的问题

业务需要,需要导出大量的Excel,其中有部分涉及到几万行的数据,直接OOM,调大JVM启动参数后,解决

设置JVM启动参数,只是治标不治本,数据行再增加,电脑内存总不能也不停增加下去

而且设置JVM启动参数还有限制,我电脑8G内存,设置-Xms=1500m -Xmx=1500m正常使用,再大一点都跑不起来了,查阅很多资料,没搞定

从根源上讲,OOM还是出现内存溢出,从这方面着手,查看到底是什么使用了大量的内存,堆中到底有些东西

推荐使用JDK中自带的一个工具,jvisualvm,肯定有更好的工具,这个是因为极其容易获取,因为它就在JDK的bin文件里

研究代码,能精简的都精简了,不太可能对效率造成那么大影响,最终定位到POI上,业务需要,每个单元格都有不同的格式和居左居右要求。发现写每行数据都要重复很多对象的创建。

workbook.createRow(xx);

row.createCell(xx);

workbook.createCellStyle();

workbook.createFont();

...

仔细看一下就会发现,很多样式和字体其实都是一样的,那么就完全没必要去重复创建

使用缓存后,不需要调大JVM参数也可以正常导出

另外,辅助使用了SXSSFWorkbook,与其他工作薄的差别就不详细说明了。它的默认值是100,它会在内存中动态处理100行的数据,达到100行后,会将这100行的内容写到磁盘中去,然后又可以处理新的100行,这样就能有效避免OOM

But,我测试一下,貌似没有什么作用,我使用的POI是3.8,我试了不同的数据量、缓存行数等,没有感觉有很明显的作用,该OOM还是OOM了

从网上也参考了其他几种方式,如生成多张sheet、生成多张excel后拼接、使用csv等,由于时间问题,无法尝试使用,毕竟火都烧到头上了

在重复使用CellStyle的时候,出现了另外一个问题,通过缓存获取到的cellStyle再为它设置对齐属性时不生效!好像总是采用了统一的行样式,每一行的样式都是一样的居右或者居左,而我要的部分居左,部分居右,尝试很多次未解决。

于是,我只能在缓存中,多缓存了几种带不同对齐方式的cellStyle,问题解决。之前的问题怀疑是POI的固有BUG,也未深入研究

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值