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

13 浏览
0 Comments

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

我正在使用GC选项XX:+UseParNewGC-XX:+UseConcMarkSweepGC来运行我的应用程序。\n正如大多数人已经体验到的那样,JVM在增加堆大小到最大堆大小方面表现出色,但它不会将内存释放回操作系统。我发现-XX:MaxHeapFreeRatio-XX:MinHeapFreeRatio,但这些对于并行垃圾收集器是被忽略的。\n是否有特殊选项可以强制JVM释放内存回操作系统,以适应-XX:MaxHeapFreeRatio和-XX:MinHeapFreeRatio的组合。

0
0 Comments

问题原因:在Java 1.8.0_45中使用-XX:+UseG1GC参数后,内存无法回收到操作系统中。

解决方法:需要调整其他参数以使G1GC能够启用内存收缩,这包括调整-XX:MaxHeapFreeRatio和-XX:MinHeapFreeRatio参数。

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参数也应该有效。

原文链接:https://stackoverflow.com/questions/31545950

0