天使漫步IT工作室天使漫步IT工作室

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


Warning: count(): Parameter must be an array or an object that implements Countable in /www/wwwroot/u11u.com/usr/themes/wq/functions.php on line 110

Warning: count(): Parameter must be an array or an object that implements Countable in /www/wwwroot/u11u.com/usr/themes/wq/functions.php on line 116

这几天开发解析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表数据都无法渲染,的确是空间太小了。

解决办法:

  • 1.tomcat自己启动的时候,更改默认jvm运行空间。(具体方法请搜索).
  • 2.myeclipse手动设置,如果:preferenred--->myeclipse---->server---->tomcatx.x---->JDK(必须到这里)---->在空白栏里面设置参数,如:
-Xmx1024M -Xms512M -XX:MaxPermSize=256m(这里不解释参数的含义了。猜也能猜到么)。

4a36100f26424dbf37d12275.jpg

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

本站原创,欢迎转载,转载敬请标明出处:天使漫步IT工作室 » 解释Excel 内存泄漏解决办法 - 报 java.lang.OutOfMemoryError: Java heap space poi
添加新评论


Warning: Use of undefined constant php - assumed 'php' (this will throw an Error in a future version of PHP) in /www/wwwroot/u11u.com/usr/themes/wq/comments.php on line 38