2016-07-28 3 views
0

Я использую версию apache pio 3.14 для экспорта некоторых данных в excel. Проблема в том, что он использует много памяти. С 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