使用memory analyzer分析堆栈内存优化poi excel导入方法

通过分析堆栈内存并采用SAX解析方式,成功将Excel导入内存占用从1GB降低至几十MB,有效解决服务器因内存占用过大导致崩溃的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近服务器崩了一次,主管发现是内存被大量占用,分析heap dump以后发现是excel导入相关的对象,占用了整整一个g,所以让我去优化一下。这个问题之前从来没出现过,虽然后来发现导入的excel不止为何有100多万行,属于意外情况,不符合日常业务,业务最多只允许上万条数据(询问客户后他们已经修改了原文件,什么样的文件或者什么样的操作会产生100多万条数据的excel已经不可考了),不过现在生成的对象也比较占内存,所以还是优化一下好了,顺便学习一下如何查看堆栈内存。

我决定使用独立的memory analyzer来分析,这样就不用局限于eclipse,而且也避免插件太多影响速度。先从官网或者其他地方下载

https://www.eclipse.org/mat/downloads.php

使用debug模式打个断点运行java程序

打开eclipse memory analyzer,点击file-Acquire Heap Dump

选择运行的类,我猜可能是从jvm里面读取的,所以不管你在哪里执行都可以读取到,运行tomcat也可以,只是最好使用debug模式,不然会一直在读取的状态,反正我等了几分钟还在读取

然后就能看到这个进程的堆栈分析结果了

实际使用比我想象中的简单多了,当然还有其他方法来生成dump文件,比如设置参数内存溢出的时候自动生成dump文件,这里这个a就是我们导入excel生成的测试对象,有一万行,大小17.7MB,一百多万行时就占一个多GB了。那么我只要修改算法,使占用的内存变小就可以了。

poi使用sax方式导入excel

可以看出同样的excel文件sax使用的内存只有十分之一。当然这个只是最原始的提取出xml,具体的内存占用情况还是要等实现解析方法后才行

https://blog.csdn.net/qq_35206261/article/details/85161693

这个具体的实现是直接使用这个博客里的,断点打在具体解析的方法上

内存解析后发现差不多是四分之一,也是挺可观的了。

查看代码后发现使用sax解析的话里面的变量都是重复使用的,没有保存成一个整体的对象,每当解析一条数据时都会给变量重新赋值。

跟dom相比就像是流水线,数据只是暂存,没那么灵活,你不能回过头来处理以前的数据或者从整体进行一些操作,除非你自己保存一个对象,不过这样就失去sax解析的意义了


上面那个SAX解析有错位的问题,就是表格中有空的单元格,有的时候会忽略掉,于是我参考下面的博客做了一定修改

https://blog.csdn.net/c5113620/article/details/79780500

增加一个hasV默认值为false

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值