У меня есть приложение Java, которое выделяет много памяти в течение первой минуты после запуска. Затем он работает еще 30 минут, но почти не требует памяти. Я хочу вернуть неиспользуемую память в ОС.Возврат памяти из JVM в ОС
Я профилировал приложение, и он выделяет около 200 МБ в первую минуту. Тогда 190 МБ собирают мусор, но процесс все еще зависает до 200 МБ, пока процесс не завершится. Он никогда не возвращает никакой памяти в операционную систему (Linux в моем случае), за исключением небольшой пары MB.
Как заставить JVM вернуть неиспользуемую память обратно в ОС?
Несколько человек уже задали тот же вопрос здесь, в stackoverflow. Обычный ответ заключается в использовании опций JVM -XX:MinHeapFreeRatio=x
и -XX:MaxHeapFreeRatio=y
. Я пробовал несколько разных комбинаций значений, но они не имеют никакого значения.
Вот как эти параметры работают, как я понял: если после сбора мусора имеется больше свободной памяти, чем MaxHeapFreeRatio, JVM может вернуть память в ОС. По какой-то причине моя JVM, похоже, не хочет этого делать. Я пробовал разные сборщики мусора (-XX:+UseParallelGC
и т. Д.) Без успеха.
Действительно ли это необходимо? –
Приложение запускается многими пользователями на одном сервере, а объединенная память быстро складывается до ГБ. Процессы могут без необходимости потреблять всю память на сервере, так как 95% памяти не используется в течение большей части срока службы приложения. – Thalwander
Все ли пользовательские процессы под одной JVM? –