内存溢出问题解决思路
这篇文章主要说下解决思路,当然也写出了对应的业务背景。用意呢,一是想记录问题处理过程,作为以后的经验;二呢,分享给大家,可以听听故事借鉴下。
开始了。
项目报错什么错呢?
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: GC overhead limit exceeded
报错的业务功能是:
导出数据为加密的EXCEL文档。
也就是 把10万条数据从数据库读出来,放到excel表格中,再放到内存中,对表格进行加密处理,最后返回文件流。
当时背景是:
本地idea运行没问题,部署到服务器却出现上面的内存溢出ERROR。
于是我分析:
方向一:程序代码有问题,对象创建太多。10万行*5列=50万个单元格对象,可能是多了。于是用分页查询数据的方式,10万条数据分为20次,即每次查询5000条数据,分批放进sheet对象中。然而这样做并没啥卵用。
方向二:给JVM扩容。把原来启动参数-Xms256M -Xmx512M,扩大到768和1024,于是问题解决了,不报内存溢出了。
但是!治标不治本,这个程序的内存是扩大了,但有可能影响别的程序正常使用。
于是再百度搜各种“poi内存溢出问题”,终于找着内存溢出的根本原因了。原来,是我用的POI版本太低了,高版本POI已经解决了内存溢出的问题,即通过限定内存中到达一定行数时清空内存的方式。
原来一直用的百度关键字要么是“java.lang.OutOfMemoryError”,要么是“GC overhead limit exceeded”,而换个关键词“poi内存溢出问题” 去搜索,答案 早已有前辈po出。
总结一下,遇到问题,要多方面考虑原因,然后根据可能的具体原因去百度搜,不然就像大海捞针。
原文地址:https://www.cnblogs.com/one-gril/p/11614237.html