Ответ вслух Middle JVM: память, GC, загрузка классов спрашивают часто обновлено

Как работает сборка мусора

Вопрос

Расскажите, как работает сборщик мусора в JVM и как выбрать сборщик.

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

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

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

Коротко

Сборщик считает живыми объекты, достижимые от GC roots: стеков потоков, статических полей, JNI. Остальное мусор, циклы не мешают.

Что должно прозвучать в ответе

  • Достижимость от GC roots, а не подсчёт ссылок

  • Поколения: Eden, Survivor, Old; minor и major/full сборки

  • Stop-the-world паузы и конкурентные фазы

  • G1 по умолчанию: регионы и цель по паузе

  • ZGC для низкой задержки на больших кучах, Parallel для пропускной способности

  • Настройка: Xmx, логи GC, MaxRAMPercentage в контейнере

Что могут спросить следом

  • Что такое Humongous-объекты в G1?
  • Почему увеличение кучи иногда ухудшает паузы?
  • Как понять по логам, что GC стал проблемой?

Разбор

Сборщик считает живыми объекты, достижимые от GC roots: стеков потоков, статических полей, JNI. Остальное мусор, циклы не мешают. Куча поколенческая: объекты рождаются в Eden, minor GC копирует выживших в Survivor, а пережившие несколько сборок уходят в Old. Это дёшево, потому что большинство объектов умирает молодыми. Часть работы требует остановки приложения, stop-the-world, современные сборщики сокращают её за счёт конкурентных фаз. G1 по умолчанию: куча из регионов, он собирает сначала самые замусоренные и старается уложиться в цель по паузе, 200 мс по умолчанию. Если нужна задержка в единицы миллисекунд на больших кучах, беру ZGC, для батчей, где важна пропускная способность, Parallel. На практике сначала смотрю логи -Xlog:gc, частоту и длительность пауз, в контейнере задаю MaxRAMPercentage, и только потом трогаю флаги.

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

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

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