2013-11-18 7 views
2

У меня есть приложение Java, которое выделяет много памяти в течение первой минуты после запуска. Затем он работает еще 30 минут, но почти не требует памяти. Я хочу вернуть неиспользуемую память в ОС.Возврат памяти из JVM в ОС

Я профилировал приложение, и он выделяет около 200 МБ в первую минуту. Тогда 190 МБ собирают мусор, но процесс все еще зависает до 200 МБ, пока процесс не завершится. Он никогда не возвращает никакой памяти в операционную систему (Linux в моем случае), за исключением небольшой пары MB.

Как заставить JVM вернуть неиспользуемую память обратно в ОС?

Несколько человек уже задали тот же вопрос здесь, в stackoverflow. Обычный ответ заключается в использовании опций JVM -XX:MinHeapFreeRatio=x и -XX:MaxHeapFreeRatio=y. Я пробовал несколько разных комбинаций значений, но они не имеют никакого значения.

Вот как эти параметры работают, как я понял: если после сбора мусора имеется больше свободной памяти, чем MaxHeapFreeRatio, JVM может вернуть память в ОС. По какой-то причине моя JVM, похоже, не хочет этого делать. Я пробовал разные сборщики мусора (-XX:+UseParallelGC и т. Д.) Без успеха.

+0

Действительно ли это необходимо? –

+0

Приложение запускается многими пользователями на одном сервере, а объединенная память быстро складывается до ГБ. Процессы могут без необходимости потреблять всю память на сервере, так как 95% памяти не используется в течение большей части срока службы приложения. – Thalwander

+0

Все ли пользовательские процессы под одной JVM? –

ответ

1

Вы не можете сила JVM, чтобы вернуть память. Настройки являются рекомендательными.

Также вы можете обнаружить, что JVM необходимо перенести одну или более сборщиков мусора, прежде чем она решит, что она может вернуть память.

Смежные вопросы