内存溢出解决思路

Posted one-gril

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存溢出解决思路相关的知识,希望对你有一定的参考价值。

内存溢出问题解决思路

 

这篇文章主要说下解决思路,当然也写出了对应的业务背景。用意呢,一是想记录问题处理过程,作为以后的经验;二呢,分享给大家,可以听听故事借鉴下。

开始了。

 

项目报错什么错呢?

  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,扩大到7681024,于是问题解决了,不报内存溢出了。

      但是!治标不治本,这个程序的内存是扩大了,但有可能影响别的程序正常使用。

      于是再百度搜各种poi内存溢出问题”,终于找着内存溢出的根本原因了。原来,是我用的POI版本太低了,高版本POI已经解决了内存溢出的问题,即通过限定内存中到达一定行数时清空内存的方式。

 

  原来一直用的百度关键字要么是“java.lang.OutOfMemoryError”,要么是“GC overhead limit exceeded”,而换个关键词“poi内存溢出问题” 去搜索,答案 早已有前辈po出。

 

总结一下,遇到问题,要多方面考虑原因,然后根据可能的具体原因去百度搜,不然就像大海捞针。

 

以上是关于内存溢出解决思路的主要内容,如果未能解决你的问题,请参考以下文章

spark内存溢出及其解决方案

强如 Disruptor 也发生内存溢出?

Java内存溢出问题总结

Java内存区域与内存溢出异常

Java学习---内存溢出的排查经历

linux服务器老是内存溢出杀死mysql,怎么解决