如何使JVM释放内存回到操作系统

Pus*_*kar 7 java garbage-collection jvm-arguments

我正在XX:+UseParNewGC-XX:+UseConcMarkSweepGC为我的应用程序使用GC选项.

正如大多数人已经体验到的那样,JVM擅长将堆增加到最大堆大小,但它不会将内存释放回操作系统.我遇到了-XX:MaxHeapFreeRatio,-XX:MinHeapFreeRatio但对于并行垃圾收集器,这些都被忽略了.

是否有特殊选项可将JVM释放内存强制回OS以进行-XX:MaxHeapFreeRatio and -XX:MinHeapFreeRatio组合.

Evg*_*eev 5

在我的Java 1.8.0_45 -XX上:+ UseG1GC使内存缩小.这是我的测试:

    MemoryPoolMXBean m = ManagementFactory.getMemoryPoolMXBeans().get(5);
    System.out.println(m.getName());
    byte[] a = new byte[512 * 1024 * 1024];
    System.out.println(m.getUsage().getCommitted() / 1024 / 1024);
    a = null;
    System.gc();
    Thread.sleep(1000);
    System.out.println(m.getUsage().getCommitted() / 1024 / 1024);
Run Code Online (Sandbox Code Playgroud)

  • 如果 G1GC 启用收缩,那么 -XX:MaxHeapFreeRatio 和 -XX:MinHeapFreeRatio 也应该起作用 (2认同)