2010-11-25 8 views
2

私はJavaでRandomAccessFileを使用しています。私はメモリリークの問題があります。私は次の私のコードを単純化しています。このコードを実行(およびGCのための十分な時間を許可する)した後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); } 
} 

アプリケーションのための報告されたメモリ使用量が少し150メガバイトを超えています。

私は何が欠けていますか?それともJavaが責任を負うのですか?

答えて

1

メモリはGC実行時にのみ再利用され、GCは必要なときにのみ実行されます。 メモリ使用量が低下していることを確認する場合は、System.gc()を呼び出してみてください。

BTW:JavaはメモリをOSに返すのではなく、内部的に空きメモリを増やす傾向があります。

+2

のJava * OSに*戻りメモリを行い、少なくともOracle JVMは非常にreluctantyいえ、ありません。 –

+0

@マイケル、ありがとう。 –

2

どのようにメモリ使用量をチェックしますか? OSによって報告される使用法は、Javaヒープのサイズが拡張されていることを示しています。ヒープが空であるかどうか、またはヒープがいっぱいであるかどうかはGCに適格なオブジェクトであるかどうかはわかりません。

Java関連のツール(VisualVM、jmapなど)を使用する必要があります。これにより、ヒープメモリの状態をより正確に把握できます。 VisualVMを使用すると、GCを手動でアクティブ化し、ヒープ占有率を調べてメモリリークがあるかどうかを判断できます。

6

GCは、メモリをJVM内でのみ使用できるようにします。 GCによって解放されたメモリは、ではなく、が自動的にOSに返されます。 JVMは一般的に、メモリをOSに戻すことを非常に嫌っている。なぜなら、JVMはすぐに再び必要となる可能性があり、OSからのメモリを取得することは比較的高価な作業であるからである。

ヒープメモリの使用率と空き容量を確認するには、Visual VMを使用します。あなたはJVMが熱心にOSにメモリを返すMORしたい場合は、tuning parameters of the Oracle JVMを使用することができ、特に-XX:MaxHeapFreeRatio-XX:MinHeapFreeRatio