Как работает сборка мусора
Вопрос
Расскажите, как работает сборщик мусора в JVM и как выбрать сборщик.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Достижимость от 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 ошибок.
Термины по теме
Ещё по теме «JVM: память, GC, загрузка классов»
- Делегирование загрузчиков
- JVM в контейнере
- Сборщик по умолчанию
- Escape analysis
- Этапы загрузки класса
- GC roots
- Области памяти JVM
- Виды ссылок