2010-11-25 47 views
2

我在java中使用RandomAccessFile。我有一個內存泄漏問題。我簡化了我的代碼如下:RandomAccessFile內存泄漏

public static void main(String[] args) throws IOException, InterruptedException 
{ 
    RandomAccessFile r = new RandomAccessFile(new File("test.dat"), "rw"); 
    r.write(new byte[150000000], 0, 150000000); 
    r.getFD().sync(); 
    r.close(); 
    r = null; 

    while (true) { Thread.sleep(1000); } 
} 

這段代碼執行(並允許有足夠的時間GC)應用程序的報告的內存使用後略微超過150MB。

我錯過了什麼?或者是Java責怪?

回答

1

GC只在運行時回收內存,而GC只在需要時運行。 如果您想查看內存使用情況,請嘗試調用System.gc()。

BTW:Java不保證將內存返回到操作系統,而是傾向於增加內部的可用內存。

+2

的Java *不*回報存儲到操作系統,至少在Oracle JVM呢,雖然很reluctanty。 – 2010-11-25 09:48:07

2

如何檢查內存使用情況?操作系統報告的使用情況只表示java堆的大小已經擴大。您無法知道堆是否爲空,或者它是否已滿,但是具有符合GC要求的對象。

您應該使用一些與Java相關的工具(例如VisualVM或jmap)。這會讓您更好地瞭解堆內存狀態。使用VisualVM,您可以手動激活GC,然後檢查堆佔用情況以確定是否存在內存泄漏。

6

GC只會使內存在JVM中可用。 GC釋放的內存是而不是自動返回到操作系統。 JVM通常很不願意將內存返回給操作系統,因爲它很快會再次需要它,從操作系統獲取內存是一項相對昂貴的操作。

要查看正在使用和釋放的堆內存的百分比,可以使用Visual VM。如果你想在JVM內存急切地回到OS鐵道部,你可以使用tuning parameters of the Oracle JVM,特別-XX:MaxHeapFreeRatio-XX:MinHeapFreeRatio