RandomAccessFile内存泄漏

Jon*_*han 2 java random-access

我在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); }
}
Run Code Online (Sandbox Code Playgroud)

执行此代码后(并为GC提供足够的时间),报告的应用程序内存使用量略高于150MB.

我错过了什么?还是Java应该受到责备?

Mic*_*rdt 6

GC只会使内存可用于JVM.GC释放的内存不会自动返回给操作系统.JVM通常非常不愿意将内存返回给操作系统,因为它可能很快就会再次需要它,并且从操作系统获取内存是一项相对昂贵的操作.

要查看正在使用和免费的堆内存百分比,可以使用Visual VM.如果你想在JVM内存急切地回到OS铁道部,您可以使用了Oracle JVM的调整参数,特别是-XX:MaxHeapFreeRatio-XX:MinHeapFreeRatio