Выбор ответа Senior JVM: память, GC, загрузка классов обновлено

JVM в контейнере

Вопрос

Сервис в Kubernetes с лимитом памяти 2 ГБ запущен без флагов памяти. Какой будет максимальная куча в Java 21 по умолчанию?

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

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

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

Коротко

Правильный ответ: Около 512 МБ: 25% от лимита контейнера. Современные JVM видят лимиты cgroup (UseContainerSupport включён по умолчанию) и берут MaxRAMPercentage = 25%.

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

  1. 2 ГБ: вся доступная контейнеру память целиком
  2. Четверть памяти всего узла кластера, а не контейнера
  3. Около 512 МБ: 25% от лимита контейнераправильный ответ
  4. 64 МБ, как у клиентской JVM по умолчанию

Разбор

Современные JVM видят лимиты cgroup (UseContainerSupport включён по умолчанию) и берут MaxRAMPercentage = 25%. В контейнере, где кроме JVM ничего нет, это расточительно, поэтому обычно задают -XX:MaxRAMPercentage=75. Всю память отдавать под кучу нельзя: нужны Metaspace, стеки потоков, code cache, direct-буферы. Память узла JVM в контейнере с лимитом не использует.

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

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

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