Получить доступ

На какой гипотезе построено разделение кучи на поколения?

MiddleJVM и сборка мусора
Ещё спрашивают так:
  • Как из гипотезы о поколениях следует устройство minor GC?
  • На какой гипотезе построено поколенческое разделение кучи и как из неё следует устройство minor GC?
Коротко

Слабая гипотеза о поколениях: почти все объекты умирают молодыми, а пережившие несколько сборок живут долго. Отсюда молодое поколение с копирующим сборщиком: цена сборки пропорциональна числу живых, а их мало — minor GC дёшев.

  • Выделение в Eden — сдвиг указателя
  • Возраст растёт с каждой сборкой, после порога tenuring — в старое поколение
  • Старое собирают редко и другими алгоритмами
  • Ссылки из старого в молодое отслеживает card table

А ещё Мал Survivor — преждевременное продвижение мусора и частые full GC

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

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

GC: Eden, Survivor и продвижение

Подробно

Из этой гипотезы вытекает вся конструкция. Раз в молодом поколении почти всё мертво, там выгоден копирующий сборщик: он переносит немногих выживших, а стоимость работы пропорциональна живым объектам, а не мусору — поэтому minor GC дёшев. Старое поколение, где мусора мало, собирают другими алгоритмами (пометка-очистка или пометка-сжатие) и заметно реже. Практическое следствие для кода: короткоживущие объекты в Java дёшевы, и бороться с их созданием ради «экономии на GC» обычно вредно.

Что хотят услышать

  • Формулировка гипотезы.
  • Вывод из неё конструкции молодого поколения.
  • Продвижение и сбой схемы.

Частые ошибки

  • Считать, что аллокация объекта в Java дорога сама по себе.
  • Путать причину и следствие: поколения появились из-за статистики жизни объектов, а не наоборот.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Подавляющее большинство объектов умирает молодыми, а пережившие юность живут долго
  • ✗Большие объекты живут дольше маленьких
  • ✗Объекты, созданные в одном потоке, умирают одновременно
  • ✗Число объектов в куче растёт линейно со временем работы приложения

Что спросят дальше

  • Почему копирующий сборщик эффективен именно в молодом поколении?
  • Что такое tenuring threshold?
  • Что такое TLAB и как он ускоряет выделение памяти?
  • Почему у G1 понятие поколений сохранилось, хотя куча разбита на регионы?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем