Ответ
Эвакуация данных (также известная как уплотнение или compaction) — это стратегия работы сборщика мусора, при которой "живые" (используемые) объекты копируются из одной области памяти в другую.
Важное замечание: Текущая реализация сборщика мусора в Go не использует эвакуацию. Go использует конкурентный сборщик мусора типа "mark-and-sweep" (пометка и очистка), который работает без перемещения объектов. Однако понимание концепции эвакуации полезно для общего развития.
Как работает эвакуация (в теории):
- Разделение памяти: Куча (heap) делится на две или более областей (например, "from-space" и "to-space").
- Пометка и копирование: GC сканирует граф объектов, находя все живые объекты в "from-space".
- Эвакуация: Вместо того чтобы просто пометить, GC копирует (эвакуирует) эти живые объекты в "to-space", располагая их плотно друг к другу.
- Обновление указателей: Все указатели на старые адреса объектов обновляются, чтобы они указывали на их новые местоположения в "to-space".
- Очистка: Область "from-space" целиком объявляется свободной. Роли областей меняются местами для следующего цикла GC.
Преимущества:
- Борьба с фрагментацией: Уплотнение живых объектов освобождает большие непрерывные блоки памяти, что ускоряет последующие аллокации.
Недостатки:
- Затраты на копирование: Перемещение объектов требует процессорного времени и может быть медленным.
- Паузы (Stop-The-World): Обновление указателей — сложная операция, которая часто требует полной остановки выполнения программы.
Go выбрал другой путь, приоритезируя минимальные паузы (low-latency GC) за счет отказа от уплотнения.