Назад к вопросам
СБЕР
Middle+
3
Расскажи про Garbage Collector в Go — алгоритм, способы оптимизации
Компании, где спрашивали
Ответ от нейросети
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
}