2016-07-28 15 views
0

私はapache pio version 3.14を使っていくつかのデータをExcelにエクスポートしています。問題は、それが多くのメモリを使用することです。 VisualVMを使用すると、oldgenのデータが約80M〜約400Mの範囲で800Kのエクスポートファイルを作成し、そこにとどまることに気付きました。何度も何度も操作を繰り返しても、それは成長し続けます。 XSSFWorkbookは決してガベージコレクトされておらず、Excelファイルからすべてのセル/シートの参照を保持しているようです。 SXSSFWorkbookを使ってみましたが、メモリ使用量は似ています。 メモリ使用量を減らす方法はありますか?または、XSSFWorkbookをどのように処分できますか?私はワークブックを閉じて、nullへの参照を作ろうとしましたが、これは助けになりません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

関連する問題