Я использую версию 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
Если это дорого, сделайте это самостоятельно. – RayanFar
Можете ли вы предоставить фрагмент кода, пожалуйста? –