Выбор ответа Senior Память и OOM обновлено
-Xmx равен лимиту контейнера
Вопрос
Контейнер с JVM имеет лимит 2 GiB и запущен с -Xmx2g. Под нагрузкой его убивает OOMKilled. Почему?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Кроме кучи есть metaspace, стеки и direct-буферы, и вместе они больше. Лимит cgroup ограничивает всю память процесса, а -Xmx только кучу.
Варианты ответа
- Кроме кучи есть metaspace, стеки и direct-буферы, и вместе они большеправильный ответ
- JVM в контейнерах игнорирует
-Xmxи берёт всю память узла - Сборщик мусора отключается при заполнении кучи на 100%
- Лимит контейнера считается в десятичных гигабайтах, а
-Xmxв двоичных
Разбор
Лимит cgroup ограничивает всю память процесса, а -Xmx только кучу. Поверх неё нужна ещё память под metaspace, стеки, JIT и нативные буферы. Обычно кучу ставят 50-75% лимита (например -XX:MaxRAMPercentage=75). -Xmx JVM соблюдает, GC не отключается, а 2Gi и 2g это двоичные гигабайты.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.