2012-01-22 7 views
2

私は、apache-POIを使用して大きなxlsxファイルを生成するアプリケーションを作成しています。 ある時点でOutOfHeapSpace例外が発生します。java - 実行時に現在使用されているヒープスペースをチェックできますか?

すぐに空き領域がなくなりメモリが解放されたと判断し、ディスクからファイルを読み込んで書き込みを続けると、xlsxファイルに内容を書き込んで解決したいと考えています。

もっと良い解決策は、各ブロックに書き込むセルの数を事前に定義してブロックをディスクに書き込むことですが、いずれにしても、これによってヒープを判断する方法実行時に残されたスペース?

+2

これは役に立ちますか? http://www.exampledepot.com/egs/java.lang/GetHeapSize.html – c24w

+0

はい、ヒープスペースに関する質問があります。繁栄は貪欲な問題を解決しました。ありがとうございます。 – AAaa

答えて

3

実行時に使用されていないメモリを解放することは、ガベージコレクションのタイミングをかなり自由に決めることができるため、おそらくあまり信頼性がありません。

POI最近introduced the SXSSF APIストリーミングを使用しており、スプレッドシートを作成するためのメモリ使用量を大幅に削減します。これは非常に大きなxslsファイルでも役立ちます。表示されている2つの短所があります。hereしかし、あなたがそれらと一緒に暮らすことができれば、ヒープ関連の問題を緩和するはずです。

1

JVM JMX MBeansのいずれかを使用することを検討する価値があります。 このようにMemoryPoolMXBean

2

利用可能なメモリを取得できますが、GCをトリガーせずに割り当てることができる最大量だけを示します。

代わりに、GCを起動して、ワード後にどれくらいのメモリが空いているかを確認できます。問題は、これは実行オーバーヘッドがあることです。

別のオプションは、JMX経由でGCのクリーンアップを監視し、それが自然に(それが実行されない場合、あなたは問題ありません)GCをトリガした後、自由にどのくらいのを確認することです

3

MemoryMXBeanを与えることができます現在のメモリ使用量に関するかなりの量の情報が得られます。

public class PrintMemory { 
    public static void main(String[] args) { 
     MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean(); 
     long[] array; 
     for (int i = 0; i < 100; i++) { 
      array = new long[100000]; 
      System.out.printf("%d%n", memoryMXBean.getHeapMemoryUsage()); 
     } 
    } 
} 
関連する問題