Сборщик мусора в Go основан на маркирующем-удаляющем алгоритме с триггером по выделению памяти. Он работает параллельно с основной программой и минимизирует паузы.
Ключевые моменты:
- Три набора цветов:
- Белый: Объекты, которые не были посещены и потенциально являются мусором.
- Серый: Объекты, доступные из корней, но еще не просканированные.
- Черный: Объекты, доступные из корней и уже просканированные.
- Маркировка: Сборщик начинается с корней (глобальные переменные, стек каждого горутины), помечая доступные объекты как серые. Затем он рекурсивно сканирует серые объекты, помечает достижимые из них как серые, а сканируемые объекты становятся черными.
- Фаза STW (Stop-The-World) во время маркировки: Кратковременная остановка выполнения всех горутин в начале маркировки для создания снимка графа объектов и в конце для переключения состояния.
- Параллельная маркировка: Основная часть маркировки выполняется параллельно с работой программы.
- Удаление: После маркировки все объекты, оставшиеся белыми, считаются недостижимыми и освобождаются. Go не требует явного обнуления указателей.
go
- Триггер: Сборщик запускается, когда объем выделенной памяти превышает некоторый порог, зависящий от предыдущего объема выделенной памяти. По умолчанию этот порог в два раза больше предыдущего использованного объема памяти.
- Цель: Поддерживать низкую задержку, избегая длительных пауз "Stop-The-World".
go
В целом, сборщик мусора Go эффективен и требует минимального участия разработчика.