【问题标题】:How to make JVM release memory back to OS [duplicate]如何使JVM将内存释放回操作系统[重复]
【发布时间】:2015-07-15 04:30:26
【问题描述】:

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

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

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

【问题讨论】:

  • 嗯.. 即使你找到了这些东西的选项,它们也不能保证跨架构工作。
  • @TheLostMind - 保证 -XX:MaxHeapFreeRatio-XX:MinHeapFreeRatio 在 Oracle 的 64 位 linux JVM 上工作我不太确定上述参数 -XX:MaxHeapFreeRatio-XX:MinHeapFreeRatio 是否仅适用于串行垃圾收集器或不是。我发现了相互矛盾的引用。
  • XX:+UseParNewGC 具有最大和最小堆空闲比率至少在我的 Windows 64 位设置中释放内存回 Java 1.8.0_73 及以后的操作系统。但是,如果您没有明确向 GC 请求它,它可能只会在操作系统处于内存压力下时才决定这样做。最后,我不知道 UseConcMarkSweepGC 选项是否改变了这一切。

标签: java garbage-collection jvm-arguments


【解决方案1】:

在我的 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 之外,我是否需要调整任何参数?
  • 如果 G1GC 启用收缩,那么 -XX:MaxHeapFreeRatio 和 -XX:MinHeapFreeRatio 也应该可以工作
猜你喜欢
  • 2010-10-15
  • 1970-01-01
  • 2019-11-02
  • 2015-08-08
  • 1970-01-01
相关资源
最近更新 更多