Sobes.tech
Back to questions
Middle+
4

Расскажи про Garbage Collector в Go — алгоритм, способы оптимизации

Companies where asked
СБЕРСБЕР

Answer from AI

sobes.tech AI

В Go используется конкурентный, триггерный сборщик мусора с алгоритмом mark-and-sweep (отметь-и-убери). Он работает параллельно с основными горутинами, минимизируя паузы.

Основные особенности GC в Go:

  • Параллельный и инкрементальный: сборщик работает одновременно с программой, разбивая работу на небольшие части.
  • Триггерный: запускается при достижении определённого порога использования памяти.
  • Трёхфазный процесс: отметка достижимых объектов, очистка недостижимых, обновление метаданных.

Способы оптимизации:

  • Минимизировать аллокации: переиспользовать объекты, использовать пул объектов (sync.Pool).
  • Избегать удержания ссылок: освобождать ссылки на объекты, чтобы GC мог их собрать.
  • Настройка GOGC: переменная окружения или runtime/debug.SetGCPercent регулирует порог запуска GC (уменьшение снижает задержки, но увеличивает частоту).
  • Профилирование: использовать pprof для анализа аллокаций и выявления узких мест.

Пример использования пула для оптимизации аллокаций:

var bufPool = sync.Pool{
    New: func() interface{} {
        return make([]byte, 1024)
    },
}

func process() {
    buf := bufPool.Get().([]byte)
    defer bufPool.Put(buf)
    // использовать buf
}