2012-01-22 27 views
2

我正在編寫一個應用程序,使用apache-POI生成一個大的xlsx文件。 在某個時間我得到OutOfHeapSpace異常。java - 是否有可能在運行時檢查當前使用的堆空間?

我想通過將內容寫入xlsx文件來解決它,當我確定我很快就會出現空間不足,從而釋放內存,然後從磁盤讀取文件並繼續寫入。

一個更好的解決方案可能是預先定義我將在每個「塊」中寫入的單元的數量,然後將塊寫入磁盤,但無論如何,這使我想知道是否有辦法確定堆運行時留下的空間?

+2

這有幫助嗎? http://www.exampledepot.com/egs/java.lang/GetHeapSize.html – c24w

+0

是的,它是關於堆空間的問題。彩旗解決了問題。 謝謝大家。 – AAaa

回答

3

在運行時釋放未使用的內存可能不是很可靠,因爲JVM在決定何時進行垃圾收集時具有相當大的自由度。

POI最近introduced the SXSSF API使用流,從​​而大大減少了寫入電子表格的內存佔用。即使使用非常大的xsls文件,這也應該有所幫助。有幾個缺點,顯示here。但如果你能和他們一起生活,這應該可以緩解你的堆相關問題。

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()); 
     } 
    } 
} 
相關問題