Сборщик мусора (GC) — это механизм автоматического управления памятью, который:
┌─────────────┐ ┌─────────────────┐ ┌─────────────┐ ┌─────────────┐
│ Mark Setup │───>│ Concurrent Mark │───>│ Mark Term. │───>│ Sweep │
└─────────────┘ └─────────────────┘ └─────────────┘ └─────────────┘
STW Concurrent STW Concurrent
GOGC - процент роста кучи для запуска GC (по умолчанию 100)
GOGC=50
- запускать GC при 50% ростаGOGC=off
- полностью отключить GCМониторинг:
func printGCStats() {
t := time.NewTicker(time.Second)
defer t.Stop()
for range t.C {
var m runtime.MemStats
runtime.ReadMemStats(&m)
fmt.Printf("GC cycles: %d, Last GC: %v\n",
m.NumGC, time.Unix(0, int64(m.LastGC)))
}
}
Механизм, который:
// Пример, где write barrier важен
func updatePointer(old *Object, new *Object) {
*old = *new // Write barrier отследит это изменение
}
GC запускается когда:
runtime.GC()
вручнуюУменьшайте аллокации в куче:
Пример оптимизации:
// Плохо: создает новый объект при каждом вызове
func getData() *Data {
return &Data{} // Аллокация в куче
}
// Лучше: использовать sync.Pool
var dataPool = sync.Pool{
New: func() interface{} { return &Data{} },
}
func getData() *Data {
return dataPool.Get().(*Data)
}
Версия | Основные улучшения |
---|---|
1.0 | Простой mark-and-sweep |
1.5 | Конкурентный маркировщик |
1.8 | Уменьшение STW до <1ms |
1.12 | Оптимизация работы с большими кучами |
1.14 | Улучшение планирования GC |
1.18 | Оптимизация работы с множеством мелких объектов |
сборщик мусора в Go — это высокооптимизированная система, обеспечивающая баланс между производительностью и простотой разработки. Понимание его работы помогает писать эффективный код, минимизирующий накладные расходы на управление памятью. Современные версии Go делают GC практически "незаметным" для большинства приложений, сохраняя при этом предсказуемое поведение.