Go использует параллельный, трехцветный, некомпактирующий сборщик мусора с низкими задержками.
Основные принципы работы:
- Маркировка (Mark): Определяет, какие объекты достижимы из корневых указателей (регистров, стеков горутин, глобальных переменных). Используется трехцветный алгоритм (белый - не посещен, серый - посещен, но потомки еще не проверены, черный - посещен и все потомки проверены).
- Сбор (Sweep): Удаляет недостижимые объекты (остаются белыми) и освобождает память для повторного использования.
Особенности:
- Параллельный: Маркировка происходит параллельно с выполнением пользовательского кода (STW - Stop-The-World фазы очень короткие).
- Низкие задержки: Разработан для минимизации пауз в работе приложения.
- Некомпактирующий: Не перемещает живые объекты в памяти, что может приводить. к фрагментации, но упрощает реализацию и ускоряет маркировку/сборку.
Фазы работы:
- Mark assist: Пользовательские горутины помогают сборщику в фазе маркировки при выделении памяти.
- Marking: Параллельная маркировка достижимых объектов.
- Mark termination: Короткая STW фаза для финализации маркировки.
- Sweeping: Параллельное удаление недостижимых объектов.
Управление:
- Автоматический.
- Пороги сборки мусора (GC trigger) регулируются с помощью переменной окружения
GOGC. По умолчанию GOGC=100, что означает, что сборка начнется, когда размер кучи удвоится относительно предыдущего цикла сборки.
- Функция
runtime.GC() принудительно запускает сборку мусора, но ее использование не рекомендуется в стандартном коде.
go
Преимущества:
- Автоматическое управление памятью, снижает вероятность ошибок (утечек памяти, двойных освобождений).
- Спроектирован для конкурентного выполнения.
Недостатки:
- Недетерминированное время работы GC.
- Возможное увеличение потребления памяти по сравнению с ручным управлением.