我正在使用apache pio 3.14版將某些數據導出爲excel。問題是它使用了大量的內存。使用VisualVM,我注意到oldgen中的數據從大約80M到大約400M的800K導出文件發射並保持在那裏。如果我反覆重複操作,它會不斷增長。看來XSSFWorkbook從未被垃圾收集,並且它保存了excel文件中所有單元格/工作表的引用。 我試過使用SXSSFWorkbook,但內存使用情況類似。 有沒有辦法減少內存使用量?或者我該如何處置XSSFWorkbook。我嘗試關閉工作簿並將其引用爲空,但這不起作用XSSFWorkbook停留在內存中
0
A
回答
0
今天我在我們的應用程序中看到了同樣的問題。所有單元格的工作簿都在舊一代中,並且永遠不會被刪除。爲了分析問題,我創建了一個應用程序,該應用程序創建一個包含10行的工作簿,每行有10個單元格。
然後我試圖代碼移動到一個單獨的線程。
還有一些對象保留在內存中,但工作簿時,片材,行和細胞都沒有了。這是一個簡化的代碼示例,以顯示我如何測試它。
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
相關問題
- 1. XSSFWorkbook內存問題
- 2. COM Interop組件停留在內存中
- 3. 如何釋放XSSFWorkbook擁有的內存?
- 4. 停留在內存中的Asp.net緩存對象
- 5. 創建總是停留在GPU內存中的OpenGL對象
- 6. 退出後,應用程序停留在內存中
- 7. 全局變量是否總是停留在內存中..?
- 8. 表不在內容頁內停留在div中WordPress表格
- 9. OpenGL中的保留內存
- 10. 如何讓文本停留在Div內?
- 11. 在內存中保留對象(iPhone SDK)
- 12. jQuery Mobile對象留在內存中
- 13. 在python中清除/保留內存
- 14. 在任務中保留內存離散
- 15. 字符串留在內存中VB.NET
- 16. NSOperationQueue會保留在內存中多久?
- 17. PHP獲取URL停留在緩存
- 18. Azure Redis緩存停留在創建
- 19. 停留在PHP
- 20. c#XSSFWorkbook無法讀取的內容
- 21. 在Linux中爲內存映射文件保留物理內存
- 22. 當保存XSSFWorkbook只有一行更新
- 23. Jersey @Produces Apache XSSFWorkbook
- 24. 使用Javascript - 保存到磁盤文件是停留在Chrome的內存
- 25. 使圖像停留在CSS-懸停內容,當你點擊它
- 26. 導致線程停留在while循環內時停止?
- 27. 如何在java中獲取XSSFWorkBook名稱?
- 28. 頁停留在logoout
- 29. 應用停留在緩存中,即使在Android的鈦
- 30. 將部分數據保留在內存中並且保留在磁盤中
如果它很貴,自己動手吧。 – RayanFar
你能提供你的代碼片段嗎? –