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

9

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

正如大多数人已经体验到的那样,JVM在将堆增加到最大堆大小方面表现出色,但它不会释放内存回操作系统。我遇到了-XX:MaxHeapFreeRatio-XX:MinHeapFreeRatio,但这些在并行垃圾收集器中被忽略了。

是否有特殊选项强制JVM释放内存回操作系统,以符合-XX:MaxHeapFreeRatio-XX:MinHeapFreeRatio的组合。


即使你找到了这些选项,也不能保证它们能够跨架构工作。 - TheLostMind
@TheLostMind - -XX:MaxHeapFreeRatio-XX:MinHeapFreeRatio在Oracle的64位linux JVM上是否能够保证工作?我不确定上述参数-XX:MaxHeapFreeRatio-XX:MinHeapFreeRatio是否只适用于串行垃圾收集器,还是其他垃圾收集器也可以使用。我正在寻找相关引文以进行验证。 - Pushkar
在我的Windows 64位设置中,使用XX:+UseParNewGC和最大/最小堆空闲比率的Java 1.8.0_73版本至少会释放内存回操作系统。但是,如果您没有显式地要求进行垃圾回收,它可能只会在操作系统受到内存压力时才决定这样做。最后,我不知道UseConcMarkSweepGC选项是否会改变任何内容。 - nsandersen
1个回答

8
在我的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);

除了将垃圾收集器切换到G1GC之外,我需要调整其他参数吗? - Pushkar
2
如果G1GC启用了收缩功能,那么-XX:MaxHeapFreeRatio和-XX:MinHeapFreeRatio也应该起作用。 - Evgeniy Dorofeev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接