Go использует параллельный, трехцветный, некомпактирующий сборщик мусора с низкими задержками.
Основные принципы работы:
- Маркировка (Mark): Определяет, какие объекты достижимы из корневых указателей (регистров, стеков горутин, глобальных переменных). Используется трехцветный алгоритм (белый - не посещен, серый - посещен, но потомки еще не проверены, черный - посещен и все потомки проверены).
- Сбор (Sweep): Удаляет недостижимые объекты (остаются белыми) и освобождает память для повторного использования.
Особенности:
- Параллельный: Маркировка происходит параллельно с выполнением пользовательского кода (STW - Stop-The-World фазы очень короткие).
- Низкие задержки: Разработан для минимизации пауз в работе приложения.
- Некомпактирующий: Не перемещает живые объекты в памяти, что может приводить. к фрагментации, но упрощает реализацию и ускоряет маркировку/сборку.
Фазы работы:
- Mark assist: Пользовательские горутины помогают сборщику в фазе маркировки при выделении памяти.
- Marking: Параллельная маркировка достижимых объектов.
- **Mark termin