2016-07-28 209 views
0

我正在使用apache pio 3.14版將某些數據導出爲ex​​cel。問題是它使用了大量的內存。使用VisualVM,我注意到oldgen中的數據從大約80M到大約400M的800K導出文件發射並保持在那裏。如果我反覆重複操作,它會不斷增長。看來XSSFWorkbook從未被垃圾收集,並且它保存了excel文件中所有單元格/工作表的引用。 我試過使用SXSSFWorkbook,但內存使用情況類似。 有沒有辦法減少內存使用量?或者我該如何處置XSSFWorkbook。我嘗試關閉工作簿並將其引用爲空,但這不起作用XSSFWorkbook停留在內存中

+0

如果它很貴,自己動手吧。 – RayanFar

+2

你能提供你的代碼片段嗎? –

回答

0

今天我在我們的應用程序中看到了同樣的問題。所有單元格的工作簿都在舊一代中,並且永遠不會被刪除。爲了分析問題,我創建了一個應用程序,該應用程序創建一個包含10行的工作簿,每行有10個單元格。

XSSFWorkbook in Main

然後我試圖代碼移動到一個單獨的線程。

XSSFWorkbook in Runnable

還有一些對象保留在內存中,但工作簿時,片材,行和細胞都沒有了。這是一個簡化的代碼示例,以顯示我如何測試它。

public static void main(String[] args) { 
    Runnable runnable = new Runnable() { 
     @Override 
     public void run() { 
      Workbook workbook = null; 
      FileOutputStream fileOutputStream = null; 

      try { 
       workbook = new XSSFWorkbook(); 
       Sheet sheet = workbook.createSheet(); 
       Row row = sheet.createRow(0); 
       Cell cell = row.createCell(0); 
       cell.setCellValue("test"); 
       fileOutputStream = new FileOutputStream(new File("/tmp/workbook.xlsx")); 
       workbook.write(fileOutputStream); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } finally { 
       if (workbook != null) { 
        try { 
         workbook.close(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 

       if (fileOutputStream != null) { 
        try { 
         fileOutputStream.close(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     } 
    }; 

    Thread thread = new Thread(runnable); 
    thread.start(); 

    // Infinite loop to monitor with visualvm 
    for(;;); 
} 
+0

你可以添加一些示例代碼來幫助解釋這看起來像什麼嗎? – mjk