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

Каков компромисс трёх базовых алгоритмов GC: mark-sweep, mark-compact, copying?

MiddleJVM и сборка мусора
Коротко

Mark-sweep — пометить живых, освободить остальное: быстро, но фрагментация. Mark-compact — плюс уплотнение живых: нет фрагментации, но перемещение дорого. Copying — копировать живых в пустую область: быстро и без фрагментации, но нужна половина места в резерве.

  • Цена копирования пропорциональна числу живых — идеально для молодого поколения
  • Старое поколение — mark-compact или регионы
  • Реальные сборщики комбинируют алгоритмы по поколениям и регионам

А ещё Все три начинаются с обхода графа от GC-корней

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

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

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

Подробно

Mark-sweep. Фаза пометки обходит граф от корней, фаза очистки проходит по куче и добавляет непомеченные участки в списки свободной памяти. Объекты не двигаются — паузы короче, но куча превращается в решето: большой объект может не поместиться при достаточном суммарном свободном месте. Выделение памяти — поиск подходящей дыры.

Mark-compact. После пометки живые сдвигаются к началу области, ссылки на них исправляются. Свободная память — один непрерывный кусок, выделение — просто сдвиг указателя. Дорого: несколько проходов и перемещение всех живых.

Copying. Область делится на две; живые копируются из занятой в пустую, занятая очищается целиком. Работа пропорциональна живым, мусор вообще не трогается — при 95% мусора это очень дёшево. Платим резервом памяти.

фрагментациястоимостьпамять
mark-sweepесть∝ размеру кучибез резерва
mark-compactнет∝ живым, несколько проходовбез резерва
copyingнет∝ живымнужен резерв

В HotSpot: молодое поколение — копирование (Eden → Survivor), старое — mark-compact; G1 копирует целые регионы (эвакуация), ZGC и Shenandoah перемещают объекты конкурентно с приложением.

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

  • Механика и недостаток каждого алгоритма.
  • Почему копирование подходит молодому поколению.
  • Как это используют реальные сборщики.

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

  • Считать, что copying фрагментирует память.
  • Думать, что один алгоритм используется на всю кучу.

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

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

Показать варианты и ответ
  • ✓mark-sweep оставляет фрагментацию; mark-compact уплотняет живых ценой перемещения; copying быстр и без фрагментации, но требует резервного пространства
  • ✗Все три одинаковы по скорости, отличаются только именами
  • ✗copying оставляет фрагментацию, а mark-sweep уплотняет память
  • ✗mark-compact только помечает и ничего не освобождает

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

  • Почему copying удобен в молодом поколении?
  • Что такое floating garbage?

Разбор темы

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

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

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

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

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