天使漫步IT工作室

解释Excel 内存泄漏解决办法 - 报 java.lang.OutOfMemoryError: Java heap space poi

这几天开发解析excel过程中报内存泄露,当然小excel的文件不会爆,主要是比较大的excel会报,异常信息如下:

Exception in thread "Thread-21" java.lang.OutOfMemoryError: Java heap space
at org.apache.poi.hssf.usermodel.HSSFCell.<init>(HSSFCell.java:188)
at org.apache.poi.hssf.usermodel.HSSFRow.createCellFromRecord(HSSFRow.java:204)
at org.apache.poi.hssf.usermodel.HSSFSheet.setPropertiesFromSheet(HSSFSheet.java:184)
at org.apache.poi.hssf.usermodel.HSSFSheet.<init>(HSSFSheet.java:121)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:275)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:188)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:305)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:286)
at com.angel.util.ParseExcelDeptModel.parse(ParseExcelDeptModel.java:59)
at com.angel.util.ImportMajorThread.execute(ImportMajorThread.java:31)
at com.angel.util.ImportInfoThread.run(ImportInfoThread.java:23)

以上异常是在myeclipse底下编译,服务器是tomcat6.0运行的异常。可以描述为:在用poi打开excel表文件流的时候,抛出了这个异常。

看了一下异常的位置:

 1.inp = new BufferedInputStream(new FileInputStream(file));
 2.HSSFWorkbook hw = new HSSFWorkbook(inp);

在第二行就跑出了这个异常。显然是无法渲染这个文件,从而解释。

既然抛出的异常说是栈内存不足,估计是jvm开的内存缓冲区不足(网上还有说是死循环造成的,其实死循环要不断的开内存空间,最后导致内存不足),因为java程序是运行在jvm上的,即使申请额外的空间,也只能在jvm规定去区域申请。其实这个也容易理解(jvm是一个进程,运行在里面的java程序其实就是里面的线程而已,线程无法让进程申请额外的空间)。

PS:测试过程中发现,数据量减少一半之后,竟然能够渲染,这样原因就锁定在内存不足上了。

查了下资料:tomcat的开启的默认空间不是很大,印象中是64M.无论怎么说,5M的excel表数据都无法渲染,的确是空间太小了。

解决办法:

-Xmx1024M -Xms512M -XX:MaxPermSize=256m(这里不解释参数的含义了。猜也能猜到么)。

ps:jvm开启的默认空间太小了,所以造成了这个内存溢出的原因,导致文件数据无法渲染,参数的大小自己看着办。

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »