Что такое эвакуация данных (evacuation) в контексте сборщика мусора (GC)?

Ответ

Эвакуация данных (также известная как уплотнение или compaction) — это стратегия работы сборщика мусора, при которой "живые" (используемые) объекты копируются из одной области памяти в другую.

Важное замечание: Текущая реализация сборщика мусора в Go не использует эвакуацию. Go использует конкурентный сборщик мусора типа "mark-and-sweep" (пометка и очистка), который работает без перемещения объектов. Однако понимание концепции эвакуации полезно для общего развития.

Как работает эвакуация (в теории):

  1. Разделение памяти: Куча (heap) делится на две или более областей (например, "from-space" и "to-space").
  2. Пометка и копирование: GC сканирует граф объектов, находя все живые объекты в "from-space".
  3. Эвакуация: Вместо того чтобы просто пометить, GC копирует (эвакуирует) эти живые объекты в "to-space", располагая их плотно друг к другу.
  4. Обновление указателей: Все указатели на старые адреса объектов обновляются, чтобы они указывали на их новые местоположения в "to-space".
  5. Очистка: Область "from-space" целиком объявляется свободной. Роли областей меняются местами для следующего цикла GC.

Преимущества:

  • Борьба с фрагментацией: Уплотнение живых объектов освобождает большие непрерывные блоки памяти, что ускоряет последующие аллокации.

Недостатки:

  • Затраты на копирование: Перемещение объектов требует процессорного времени и может быть медленным.
  • Паузы (Stop-The-World): Обновление указателей — сложная операция, которая часто требует полной остановки выполнения программы.

Go выбрал другой путь, приоритезируя минимальные паузы (low-latency GC) за счет отказа от уплотнения.