← Назад к вопросам

Как устроен Garbage Collector?

3.0 Senior🔥 121 комментариев
#Основы Go#Производительность и оптимизация

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как устроен Garbage Collector в Go

Garbage Collector (GC) — это один из ключевых компонентов Go runtime, отвечающий за автоматическое управление памятью. Go использует трёхцветный алгоритм отметки с одновременным выполнением (tri-color mark-and-sweep with concurrent execution).

Основные компоненты GC

1. Трёхцветная разметка GC разделяет объекты на три категории:

  • Белые — объекты, не посещённые во время текущей фазы разметки
  • Серые — объекты, посещённые, но их потомки ещё не проверены
  • Чёрные — полностью обработанные объекты

Алгоритм начинает с корней (стек, глобальные переменные) и затем рекурсивно отмечает все доступные объекты.

2. Параллельное выполнение Go реализует concurrent GC, что позволяет мутаторам (основные goroutines) работать одновременно с GC. Это достигается через:

  • Барьеры записи для отслеживания изменений указателей
  • Фазы GC: выключение мира (STW) минимизирована

Фазы работы GC

// Пример кода, который может активировать GC
func allocateMemory() {
    // Большое количество аллокаций
    var data [][]byte
    for i := 0; i < 1000000; i++ {
        data = append(data, make([]byte, 1024))
    }
    // После выхода из функции, память станет мусором
    // GC может её собрать
}
  1. Mark Setup (выключение мира) — инициализация разметки, включение барьеров
  2. Concurrent Mark — основная фаза, работает параллельно с приложением
  3. Mark Termination (STW) — завершение разметки, отметка оставшихся объектов
  4. Sweep — удаление неиспользуемой памяти (может быть параллельным)

Управление и настройка

package main

import (
    "runtime"
    "runtime/debug"
    "fmt"
)

func main() {
    // Информация о памяти
    var m runtime.MemStats
    runtime.ReadMemStats(&m)
    fmt.Printf("Allocated: %v MB\n", m.Alloc / 1024 / 1024)
    
    // Принудительный GC (использовать осторожно!)
    runtime.GC()
    
    // Отключение GC (для специальных случаев)
    debug.SetGCPercent(-1)
    
    // Установка целевого процента
    debug.SetGCPercent(50) // GC при 50% росте памяти
}

Ключевые характеристики

  • Low latency: Современные версии Go (1.19+) достигают pause time < 500µs благодаря concurrent разметке
  • Адаптивность: GC автоматически настраивает частоту на основе использования памяти
  • Predictability: Управление через GOGC переменную окружения

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

Как устроен Garbage Collector? | PrepBro