Сборщик мусора (Garbage Collector, GC) в Go — это механизм автоматического управления памятью, который освобождает память, занятую объектами, ставшими недостижимыми. Вот детальное объяснение его работы:
1. Основные принципы
- Трехцветный алгоритм маркировки и очистки: Go использует модифицированную версию этого алгоритма.
- Параллельный и не вытесняющий: GC работает параллельно с программой, но требует коротких пауз (stop-the-world).
2. Фазы работы GC
Фаза маркировки
- Корневые объекты: GC начинает с маркировки корневых объектов (глобальные переменные, стек вызовов, регистры процессора).
- Обход графа: Помечает все достижимые объекты, обходя граф ссылок.
- Трехцветная система:
- Белый: Не посещенный объект.
- Серый: Посещенный, но его соседи еще не проверены.
- Черный: Посещенный и все его ссылки обработаны.
Фаза очистки
- Освобождает память, занятую белыми (недостижимыми) объектами.
- Использует пулы памяти (span) для эффективного переиспользования.
3. Оптимизации в Go GC
- Write Barrier: Механизм, который отслеживает изменения указателей во время фазы маркировки.
- Триггеры GC:
- По достижении порога памяти (GOGC, по умолчанию 100%).
- Принудительно через
runtime.GC()
.
- Pacer: Алгоритм, который регулирует частоту запусков GC, чтобы минимизировать накладные расходы.
4. Пример работы
type Node struct {
value int
next *Node
}
func main() {
a := &Node{value: 1} // Создаем объект в куче
b := &Node{value: 2}
a.next = b // Ссылка между объектами
a = nil // Объект 'a' становится недостижимым
// GC освободит память 'a' в следующем цикле
}
5. Настройки и мониторинг
- Переменные окружения:
GOGC
: задает процент роста кучи для запуска GC.
GODEBUG=gctrace=1
: выводит логи GC.
- Инструменты:
pprof
для анализа использования памяти.
runtime.ReadMemStats
для программного доступа к статистике.
Резюмируем
Сборщик мусора в Go — это высокооптимизированная система, сочетающая параллельную маркировку, эффективную очистку и минимизацию пауз. Он адаптируется под нагрузку и обеспечивает баланс между производительностью и использованием памяти.