Excel生成之java heap space异常

Excel生成之java heap space异常

问题场景

在使用poi操作,生成一个6w行,45列的excel的时候,老是报内存不够用(java heap space异常)。
一开始以为是默认启动时,内存太小,就把堆内存调至2G,但是依然报内存不够用
后来想,一个这个excel,大小最多就10m左右,数据量也不大,不应该占用这么多内存。
因此,用jvm工具,看了下内存情况

excel代码示例如下:
使用的是XSSFWorkbook,去生成excel

XSSFWorkbook xwb = new XSSFWorkbook(ins);
XSSFSheet sheet = xwb.getSheetAt(0);
XSSFRow row = sheet.createRow(1);
XSSFCell cell = row.createCell(1);

分析过程

为了分析内存占用情况,使用jvisualvm,对启动的进程做监控分析

1.内存占用和CPU情况

jvm监控截图
说明:在开始生成excel的时候,可以看到内存大幅度的增长,然后jvm对内存进行了扩容,但是依然在持续性上涨,通过cpu的活动情况,也能看到后续一直在频繁GC,但是GC后,清理不了多少内存,证明很多对象创建了,被引用了,垃圾回收器做不了回收操作
此时:初步定位,java heap space异常,应该和poi操作有关系

2.内存对象分析

在这里插入图片描述
说明:通过“抽样器”,对内存进行抽象分析。发现,Xobj.ElementXobj、Xobj.AttrXobj对象
有800w+个实例,下方还有部分对象,也存在大量实例。通过网上查阅资料,发现,poi操作,有两种模式,XSSFWorkbook模式 和 SXSSFWorkbook模式。第一种模式,就是现在使用对方式,此方式仅适用与小数据量的poi操作;第二种SXSSFWorkbook,适用与较大数据量的poi操作,看了下。

3.问题定位

通过对jvm的内存分析,定位到是XSSFWorkbook的使用,导致的内存爆炸了。

解决方案

代码如下:
说明:将 XSSFWorkbook包装一下,生成SXSSFWorkbook对象,后续poi操作均使用
Sheet、Row、Cell等接口。问题解决

XSSFWorkbook xwb = new XSSFWorkbook(ins);
SXSSFWorkbook workbook = new SXSSFWorkbook(xwb);
Sheet sheet = workbook.getSheetAt(0);

效果

在这里插入图片描述
在这里插入图片描述

内存基本平稳,GC能对对象做有效得回收,堆内存中的对象也无上述问题中,那么多额外的内存开销的对象占用了。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值