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:
- GOGC — при росте heap на N% (default 100%)
- runtime.GC() — принудительный запуск
- Таймер — 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 — невидимый ИИ-помощник для технических интервью
Попробовать бесплатно