Каков компромисс трёх базовых алгоритмов GC: mark-sweep, mark-compact, copying?
Mark-sweep — пометить живых, освободить остальное: быстро, но фрагментация. Mark-compact — плюс уплотнение живых: нет фрагментации, но перемещение дорого. Copying — копировать живых в пустую область: быстро и без фрагментации, но нужна половина места в резерве.
- Цена копирования пропорциональна числу живых — идеально для молодого поколения
- Старое поколение — mark-compact или регионы
- Реальные сборщики комбинируют алгоритмы по поколениям и регионам
А ещё Все три начинаются с обхода графа от GC-корней
Подробно
Mark-sweep. Фаза пометки обходит граф от корней, фаза очистки проходит по куче и добавляет непомеченные участки в списки свободной памяти. Объекты не двигаются — паузы короче, но куча превращается в решето: большой объект может не поместиться при достаточном суммарном свободном месте. Выделение памяти — поиск подходящей дыры.
Mark-compact. После пометки живые сдвигаются к началу области, ссылки на них исправляются. Свободная память — один непрерывный кусок, выделение — просто сдвиг указателя. Дорого: несколько проходов и перемещение всех живых.
Copying. Область делится на две; живые копируются из занятой в пустую, занятая очищается целиком. Работа пропорциональна живым, мусор вообще не трогается — при 95% мусора это очень дёшево. Платим резервом памяти.
| фрагментация | стоимость | память | |
|---|---|---|---|
| mark-sweep | есть | ∝ размеру кучи | без резерва |
| mark-compact | нет | ∝ живым, несколько проходов | без резерва |
| copying | нет | ∝ живым | нужен резерв |
В HotSpot: молодое поколение — копирование (Eden → Survivor), старое — mark-compact; G1 копирует целые регионы (эвакуация), ZGC и Shenandoah перемещают объекты конкурентно с приложением.
Что хотят услышать
- Механика и недостаток каждого алгоритма.
- Почему копирование подходит молодому поколению.
- Как это используют реальные сборщики.
Частые ошибки
- Считать, что copying фрагментирует память.
- Думать, что один алгоритм используется на всю кучу.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Все три одинаковы по скорости, отличаются только именами
- ✗mark-compact только помечает и ничего не освобождает
- ✓mark-sweep фрагментирует, mark-compact перемещает объекты, copying требует запаса памяти
- ✗copying оставляет фрагментацию, а mark-sweep уплотняет память и не требует запаса пространства
Что спросят дальше
- Почему copying удобен в молодом поколении?
- Что такое floating garbage?
Разбор темы
- GC: алгоритмы и сборщики
Mark-sweep-compact и копирование, stop-the-world и safepoints, конкурентная маркировка, G1 и ZGC и выбор по throughput/latency.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.