1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 使用memory analyzer分析堆栈内存优化poi excel导入方法

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

时间:2020-09-15 22:47:44

相关推荐

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

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

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

/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,具体的内存占用情况还是要等实现解析方法后才行

/qq_35206261/article/details/85161693

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

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

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

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

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

/c5113620/article/details/79780500

增加一个hasV默认值为false

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。