java 读取excel2007 内存不足_原创 |我是如何解决POI解析Excel出现的OOM问题的?

背景

之前接手过一个解析Excel的项目,使用的是Java里的POI组件解析的,但是在解析时候经常出现OOM,后来我从下面几个方面优化了下,解决了99%的问题,对,你没看错,只解决了99%。

解决方案

1.调整JVM的堆内存

我们知道几乎所有的java对象实例都存放在Java堆中,出现OOM肯定是堆内存不够用了,所有先调大堆内存。

下面命令把JVM启动后堆的初始内存和最大内存调整为4g:

java -Xms4g -Xmx4g

2.限制Excel大小

数据多占用内存就大,在观察了一段时间后发现有的excel是有图片或者有几十个sheet页,而真正需要解析的数据可能就几百行,所以直接在上传时候限制了Excel文件的大小。

3.修改POI源码

上面两个方案后虽然出现OOM的频率低了,但是还是会有,后来找了几个报OOM的Excel跟踪POI源码,发现好多空行POI都创建了对象,直接修改成 空行不处理就好了。

项目中使用的POI版本是3.17,修改的是XSSFSheet.java的initRows()方法,改后的代码如下,其实只加了三行代码(包含大括号):

private void initRows(CTWorksheet worksheetParam) {

_rows.clear();

tables = new TreeMap();

sharedFormulas = new HashMap();

arrayFormulas = new ArrayList();

for (CTR

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值