Middle+
64
questionbank

Расскажи о сборщике мусора (гарбидж коллектора) в языке Go.

Получайте ответы на вопросы в реальном времени с Sobes Copilot
Ответ от нейросети sobes.tech

Go использует параллельный, трехцветный, некомпактирующий сборщик мусора с низкими задержками.

Основные принципы работы:

  • Маркировка (Mark): Определяет, какие объекты достижимы из корневых указателей (регистров, стеков горутин, глобальных переменных). Используется трехцветный алгоритм (белый - не посещен, серый - посещен, но потомки еще не проверены, черный - посещен и все потомки проверены).
  • Сбор (Sweep): Удаляет недостижимые объекты (остаются белыми) и освобождает память для повторного использования.

Особенности:

  • Параллельный: Маркировка происходит параллельно с выполнением пользовательского кода (STW - Stop-The-World фазы очень короткие).
  • Низкие задержки: Разработан для минимизации пауз в работе приложения.
  • Некомпактирующий: Не перемещает живые объекты в памяти, что может приводить. к фрагментации, но упрощает реализацию и ускоряет маркировку/сборку.

Фазы работы:

  1. Mark assist: Пользовательские горутины помогают сборщику в фазе маркировки при выделении памяти.
  2. Marking: Параллельная маркировка достижимых объектов.
  3. Mark termination: Короткая STW фаза для финализации маркировки.
  4. Sweeping: Параллельное удаление недостижимых объектов.

Управление:

  • Автоматический.
  • Пороги сборки мусора (GC trigger) регулируются с помощью переменной окружения GOGC. По умолчанию GOGC=100, что означает, что сборка начнется, когда размер кучи удвоится относительно предыдущего цикла сборки.
  • Функция runtime.GC() принудительно запускает сборку мусора, но ее использование не рекомендуется в стандартном коде.
go

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

  • Автоматическое управление памятью, снижает вероятность ошибок (утечек памяти, двойных освобождений).
  • Спроектирован для конкурентного выполнения.

Недостатки:

  • Недетерминированное время работы GC.
  • Возможное увеличение потребления памяти по сравнению с ручным управлением.