ENIGMA AI
ENIGMA AI
Go Сложный

Как работает Garbage Collector в Go?

Garbage Collector в Go

Тип: Concurrent, Tri-color, Mark-and-Sweep

Три цвета:

  • Белый — потенциально мусор (не проверен)
  • Серый — достижим, но потомки не проверены
  • Чёрный — достижим, потомки проверены

Фазы GC:

1. Mark Setup (STW)
   - Включение write barrier
   - ~10-30 микросекунд

2. Marking (Concurrent)
   - Обход графа объектов
   - Параллельно с приложением

3. Mark Termination (STW)
   - Завершение маркировки
   - ~60-90 микросекунд

4. Sweeping (Concurrent)
   - Освобождение белых объектов
   - Параллельно с приложением

Write Barrier:

// При изменении указателя во время GC
// Barrier помечает объект серым

// Без barrier: объект может быть пропущен
// С barrier: гарантия корректности

Триггеры запуска GC:

  1. GOGC — при росте heap на N% (default 100%)
  2. runtime.GC() — принудительный запуск
  3. Таймер — 2 минуты без GC

Настройка:

// GOGC=100 (default) — GC при удвоении heap
// GOGC=200 — GC при утроении
// GOGC=off — отключить

import "runtime/debug"
debug.SetGCPercent(50)  // Более частый GC

Оптимизация:

// 1. Переиспользование объектов
var pool = sync.Pool{
    New: func() interface{} {
        return make([]byte, 1024)
    },
}

// 2. Избегать аллокаций в hot path
func process(data []byte) {
    // Использовать буфер из pool
    buf := pool.Get().([]byte)
    defer pool.Put(buf)
}

// 3. Профилирование
go tool pprof -alloc_space program profile.pb.gz

Go 1.19+ GOMEMLIMIT:

// Ограничение памяти
GOMEMLIMIT=1GiB ./program

// GC будет агрессивнее при приближении к лимиту

Похожие вопросы

Готовитесь к собеседованию?

ENIGMA AI — невидимый ИИ-помощник для технических интервью

Попробовать бесплатно
Все вопросы