2

Javaで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のせいですか?

4

3 に答える 3

6

GC は、メモリを JVM 内で使用できるようにするだけです。GC によって解放されたメモリは、OS に自動的に返されません。JVM は一般に、メモリを OS に戻すことに非常に消極的です。これは、すぐにメモリが必要になる可能性があり、OS からメモリを取得する操作は比較的コストがかかるためです。

使用中および空きヒープ メモリのパーセンテージを確認するには、Visual VMを使用できます。JVM がメモリを OS に積極的に返すようにしたい場合は、Oracle JVM のチューニング パラメータを使用できます。具体的には-XX:MaxHeapFreeRatio-XX:MinHeapFreeRatio

于 2010-11-25T09:47:12.997 に答える
2

メモリ使用量を確認する方法を教えてください。OS によって報告される使用量は、Java ヒープのサイズが拡大したことのみを示しています。ヒープが空かどうか、またはヒープがいっぱいであるが GC の対象となるオブジェクトがあるかどうかを知ることはできません。

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

于 2010-11-25T09:46:12.377 に答える
1

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

ところで: Java はメモリを OS に返す保証はなく、内部で空きメモリを増やす傾向があります。

于 2010-11-25T09:45:53.100 に答える