Как заставить JVM освободить память обратно в ОС

Я использую параметры GC XX:+UseParNewGC-XX:+UseConcMarkSweepGC для своего приложения.

Поскольку большинство из вас уже сталкивались с JVM, она хороша для увеличения кучи до максимального размера кучи, однако она не освобождает память обратно в ОС. Я столкнулся с -XX:MaxHeapFreeRatio и -XX:MinHeapFreeRatio, но они игнорируются для параллельных сборщиков мусора.

Существуют ли специальные параметры для принудительного возврата памяти JVM обратно в ОС для комбинации -XX:MaxHeapFreeRatio and -XX:MinHeapFreeRatio.


person Pushkar    schedule 05.05.2015    source источник
comment
Ну... Даже если вы найдете варианты для этих вещей, они не гарантируют, что они будут работать на разных архитектурах.   -  person TheLostMind    schedule 05.05.2015
comment
@TheLostMind - -XX:MaxHeapFreeRatio и -XX:MinHeapFreeRatio гарантированно работают на 64-битной Linux JVM Oracle. Я не слишком уверен, предназначены ли вышеуказанные параметры -XX:MaxHeapFreeRatio и -XX:MinHeapFreeRatio только для последовательных сборщиков мусора или нет. Я нахожу противоречивые цитаты для этого.   -  person Pushkar    schedule 05.05.2015
comment
XX:+UseParNewGC с максимальным и минимальным коэффициентами свободной кучи освобождает память обратно в ОС в java 1.8.0_73 и выше, по крайней мере, для моей 64-битной установки Windows. Однако, если вы явно не попросите об этом GC, он может решить сделать это только в том случае, если ОС испытывает нехватку памяти. Наконец, я не знаю, меняет ли что-либо из этого параметр UseConcMarkSweepGC.   -  person nsandersen    schedule 30.08.2017


Ответы (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);
person Evgeniy Dorofeev    schedule 05.05.2015
comment
Нужно ли настраивать какие-либо параметры, кроме переключения сборщика мусора на G1GC? - person Pushkar; 05.05.2015
comment
Если G1GC включает сжатие, то -XX:MaxHeapFreeRatio и -XX:MinHeapFreeRatio тоже должны работать. - person Evgeniy Dorofeev; 05.05.2015