2014-11-14 337 views
0

我寫了一些Java代碼,它從三個電子表格中獲取信息,並在具有4GB內存的計算機上生成大型電子表格(10列,26,950行)。它正在崩潰,因爲它正在生成電子表格(內存不足),但通過重寫代碼以一次讀取100行的大塊電子表格,我已經設法達到了它正在寫入輸出文件的程度因爲它遇到了內存不足的錯誤。如何釋放XSSFWorkbook擁有的內存?

所以我想如果我可以釋放三個XSSF工作簿所擁有的內存,它可能會給我足夠的內存來完成輸出文件的寫入 - 但是看起來並沒有close()指令。

我已經試過了工作簿設置爲空,但我不認爲任何釋放內存。

有誰知道「適當」的方式來關閉一個工作簿XSSF和回收它佔用的內存?

我運行Java 1.8.0_25。

回答

0

嘗試使用SXSSFWorkbook而不是XSSFWorkbook。它旨在將行刷新到磁盤而不是將其保存在內存中。

+0

謝謝 - 道歉花了我很長的時間來嘗試它。 – Simon 2014-11-28 16:35:22

1

你最有可能抓住一點讀取工作表數據,否則就應該得到垃圾收集。

您可以

  • 使用jvisualvm(包含在你的JDK)找到你的內存泄露,
  • 嘗試Runtime.getRuntime().gc()了明確的GC釋放所有引用到工作表後,
  • 採取查看streaming usermode API以生成新文件,但希望內存要求更少。