内存不足错误 – 写入Excel时的Java堆空间

我有一个近100,000条logging的数据,我试图通过Java代码使用XSSFWorkbook将数据写入.xlsx文件。 我能够从数据库中获取所有数据到一个ArrayList 。 通过迭代ArryList ,我将数据ArryList写入.xlsx文件。 当它达到8000行时,java代码会抛出Out of Memory Heap Space错误。

我曾经读过SXSSFWorkbookXSSFWorkbook更轻,所以我尝试使用SXSSFWorkbook 。 但是我仍然面临同样的问题。

那么有什么我失踪的工作簿或与我的Java代码?

最初,当我有6万条logging数据时,我使用了.xls文件。 相同的java代码可以用HSSFWorkbook生成.xls文件。

增加Java堆空间并不是一种select,因为我的数据将来会大大增加。

任何帮助将不胜感激。

一小段代码,我将数据写入Excel的方式。

 int rowNum = sheet.getLastRowNum(); Row lastRow = null ; Cell cell = null; ReportingHelperVo reportingHelperVo = null; for (ReportingVo reportingVo : reportingVos) { rowNum++; lastRow = sheet.createRow(rowNum); reportingHelperVo = reportingVo.reportingHelperVo; cell = lastRow.createCell(0); cell.setCellValue(reportingHelperVo.getLocation()); cell.setCellStyle(style); cell = lastRow.createCell(1); cell.setCellValue(reportingHelperVo.getCity()); cell.setCellStyle(style); cell = lastRow.createCell(2); cell.setCellValue(reportingHelperVo.getCountry()); cell.setCellStyle(style); } 

XSSFWorkbook – 为所有Excel文档创build对象表示(应该像DOM一样工作)。

SXSSFWorkbook – 应该需要不断的记忆。 JMV何时抛出OOM? 你使用了什么types的ResultSet ? 尝试使用FORWARD_ONLY来限制从数据库检索的JDBC驱动程序的caching数据。

BTW最好的修复OutOfMemoryError是分析堆转储。 使用-XX:+ HeapDumpOnOutOfMemoryError参数和MAT来了解您的应用程序的工作方式。

我正在逐个单元格地将数据写入.xlsx文件。 当它达到8000行时,Java代码会抛出内存堆空间错误。

重复使用现有的java对象,而不是每次迭代创buildnew的对象。

和/或使用csv文件而不是Excel。

来自数据库的页面结果,而不是一口气读完。

我很久以前曾尝试从R写入excel文件(但是使用XLConnection)有类似的问题。 最后,我通过使用write.csv解决,然后用Excel打开并使用“文本到列”来解决。 这是快速和可靠的。

SXSSFWorkbook不像重量轻,但有一个优势。

如果你声明为

 SXSSFWorkbook workbook= new SXSSFWorkbook(200); 

那么对于写在工作簿上的每200行,内存将被刷新到磁盘空间,所以在堆空间中将没有负担。

当我的excel达到3000行时,我遇到了同样的问题。 在我的情况下,POI Excel生成的主要内存相关问题发生在样式表中。 以下是我从我的代码中删除的东西。

  1. 尝试在行级别使用样式表设置。
  2. 如果您需要为每个单元格设置样式表,请避免为每个单元格设置边框。
 Workbook workBook = new SXSSFWorkbook(); 

您可以导出超过10万(100000)个logging。

您好使用最新的Apache POI JAR //并使用SXSSF进行stream式传输或下载

  SXSSFWorkbook workbook = new SXSSFWorkbook(100); workbook.setCompressTempFiles(true); Sheet sh = workbook.createSheet(); ((SXSSFSheet) sh).setRandomAccessWindowSize(100); 

//写下你的逻辑

  response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-Disposition", "attachment; filename="+filename+".xlsx"); workbook.write(response.getOutputStream()); workbook.close(); workbook.dispose();