背景

之前接手过一个解析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 (CTRow row : worksheetParam.getSheetData().getRowArray()) {

//修改poi源码 begin

if(row.getCArray().length<=0){

continue;

}

//修改poi源码 end

XSSFRow r = new XSSFRow(row, this);

// Performance optimization: explicit boxing is slightly faster than auto-unboxing, though may use more memory

final Integer rownumI = new Integer(r.getRowNum()); // NOSONAR

_rows.put(rownumI, r);

}

}

上面三个方案如果还不行,可以考虑使用 easyexcel,alibaba开源的,基于注解,可读性好,想了解更多可以参考:

https://github.com/alibaba/easyexcel

推荐阅读

如果觉得文章不错,希望可以随手转发或者”在看“哦,非常感谢哈!

关注下方公众号后回复「1024」,有惊喜哦!

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

  1. java 读取excel2007 内存不足_内存不足错误 – 写入Excel时的Java堆空间

    我有近100,000条记录的数据,我正在尝试使用XSSFWorkbook通过 Java代码将数据写入.xlsx文件.我能够将数据库中的所有数据提取到ArrayList.通过迭代ArryList,我将数 ...

  2. java 读取excel2007 内存不足_POI处理excel2007内存溢出问题

    项目中遇到数据导入.导出用excle操作的问题,数据量在W级别,因03版有6W+的限制,系统统一采用07版excel来做,采用POI进行处理,在导入.导出的时候都遇到的内存溢出的问题,导入方面主要参考 ...

  3. poi解析excel读取日期为数字的问题

    Apache poi 版本:3.12 今天在用poi解析excel文件时,碰到一个蛋疼的问题. 在我的excel文件中有一列是日期类型,例如有以下这么一行数据(日期中月份前面的0会自动去掉): 在读取 ...

  4. Java面试poi中excel版本大小_java 中 poi解析Excel文件版本问题解决办法

    java 中 poi解析Excel文件版本问题解决办法 发布时间:2020-10-02 03:46:15 来源:脚本之家 阅读:91 作者:程诺 poi解析Excel文件版本问题解决办法 poi解析E ...

  5. java解析excel报错,poi解析excel文件报错

    getFileMagic() only operates on streams which support mark(int) 使用 bis 解决 BufferedInputStream bis = ...

  6. java读取文件特别慢_如何提高在Java中读取大文件的速度?

    我只读了一个大小为167MB且行号为1884000的文件.我使用的方法是BufferedReader,以获得读取它的效果. 我注意到,随着当前行号的增加,读取文件的过程越来越慢(在这种情况下,我花了3 ...

  7. java C语言内存占用_使用Cgroup限制Java使用的内存量-思路

    1.      对一个正在运行着的进程来说,在不到达其内存使用量边界的情况下,扩大/缩小其cgroup分配的内存不会对它产生任何影响. 2.      在进程已经使用了一定量的内存的情况下,缩小其cg ...

  8. java读取jsp文件内容_使用Java读取Excel文件内容

    问题:我能用Java读取一个Excel文件吗?如果能,怎么做? 回答:是的,可以用Java读取Microsoft Excel文件.微软提供了一个Excel的ODBC驱动程序,因此我们就可以使用JDBC ...

  9. java 堆外内存 查看_超干货!Cassandra Java堆外内存排查经历全记录

    背景 最近准备上线cassandra这个产品,同事在做一些小规格ECS(8G)的压测.压测时候比较容易触发OOM Killer,把cassandra进程干掉.问题是8G这个规格我配置的heap(Xmx ...

最新文章

  1. eclipse+MapReduce
  2. ArchiMate - 发布【企业架构语言ArchiMate v0.5.pdf】
  3. 前端学习(3109):react-hello-开发者工具
  4. Axure教程 axure新手入门基础(3) 简单易上手
  5. netapp脚本保存日志_Shell脚本实战:日志关键字监控+自动告警
  6. SpringDataRedis的简单案例使用
  7. java 测试排序_java排序的几种方法 - 善待自己的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  8. 编码器z相 C语言代码,编码器的Z相是什么?
  9. HDU.4352.XHXJ's LIS(数位DP 状压 LIS)
  10. C++ 内存分配(new,operator new)详解
  11. 平衡小车从原理到实践
  12. 避坑11_VScode在vue文件内template无法使用tab补齐标签
  13. DirectX11编程11 Blend混合
  14. macOS制作Linux启动U盘,如何在Mac OS下用ISO包制作启动U盘
  15. Jlink仿真sw调试方式的4线连接方式
  16. 【黑金ZYNQ7000系列原创视频教程】01.熟悉vivadomdash;mdash;纯逻辑led实验
  17. 因计算机丢失d3dx9-30,win10 64位纯净版运行仙剑5提示缺少d3dx9_30.dll的修复方法
  18. 判断某天是该年中的多少天
  19. C语言数据结构-第七章图-电大同步进度
  20. 25 岁做什么,可在 5 年后受益匪浅?

热门文章

  1. 2013年美国开发者薪资调查报告
  2. MySQL内的连接查询(新手必知)
  3. 乔布斯演讲语录:Your time is limited, so don't waste it
  4. 腾讯智影+IDM进行数字人制作(无限使用)
  5. Picamera2初体验(四):延时摄影
  6. 是德科技赢得高通公司 5G 测试解决方案订单
  7. 毒鸡汤文案类小程序网源码
  8. 页面置换算法(局部、全局)-局部性很关键
  9. 行走的励志君——穷的时候需要记住的4点
  10. 微信小程序音频(录制、播放、重录)功能