Выбор ответа Senior Память и OOM обновлено

-Xmx равен лимиту контейнера

Вопрос

Контейнер с JVM имеет лимит 2 GiB и запущен с -Xmx2g. Под нагрузкой его убивает OOMKilled. Почему?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Кроме кучи есть metaspace, стеки и direct-буферы, и вместе они больше. Лимит cgroup ограничивает всю память процесса, а -Xmx только кучу.

Варианты ответа

  1. Кроме кучи есть metaspace, стеки и direct-буферы, и вместе они большеправильный ответ
  2. JVM в контейнерах игнорирует -Xmx и берёт всю память узла
  3. Сборщик мусора отключается при заполнении кучи на 100%
  4. Лимит контейнера считается в десятичных гигабайтах, а -Xmx в двоичных

Разбор

Лимит cgroup ограничивает всю память процесса, а -Xmx только кучу. Поверх неё нужна ещё память под metaspace, стеки, JIT и нативные буферы. Обычно кучу ставят 50-75% лимита (например -XX:MaxRAMPercentage=75). -Xmx JVM соблюдает, GC не отключается, а 2Gi и 2g это двоичные гигабайты.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме