TGViewer
Библиотека Go (Golang) разработчика Библиотека Go (Golang) разработчика @golang_lib · 2.7K subscribers
Post #694 772
Как спасти сборщик мусора от перегрева: используем sync.Pool 🛟

В продолжение темы про аллокации в куче. Если ваш высоконагруженный бэкенд создает тысячи временных объектов в секунду (например, буферы для сборки ответов на HTTP-запросы или парсинга JSON), сборщик мусора (GC) начинает задыхаться, сжигая драгоценное процессорное время.

Чтобы не выделять память каждый раз заново, в Go есть встроенный и мощный инструмент - sync.Pool.

Что это такое?
Это потокобезопасный механизм для хранения и переиспользования временных объектов.

Как это работает:

• Метод Get() достает объект из пула. Если пул пуст, автоматически вызывается функция New, которая создает новый экземпляр.
• Метод Put() возвращает объект обратно в пул после того, как он стал не нужен.

Где это реально полезно?
Идеальный кандидат для пула - bytes.Buffer, массивы байт для чтения из сети или тяжелые структуры данных. Популярные пакеты вроде fmt, encoding/json или сверхбыстрый логгер zap от Uber активно используют sync.Pool под капотом именно для снижения нагрузки на GC.

Важные нюансы (на которых часто обжигаются):

• Это не кэш. Сборщик мусора имеет полное право очистить sync.Pool в любой момент (обычно во время очередного цикла сборки), удалив объекты, которые сейчас не используются. Не пытайтесь хранить там постоянные соединения с БД или пользовательские сессии.
• Всегда сбрасывайте состояние. Перед тем как вернуть объект через Put(), его нужно очистить (например, вызвать Reset()). Иначе следующая горутина, вызвавшая Get(), получит объект с чужими «грязными» данными, что приведет к плавающим и трудноотловимым багам.

Пример правильного использования:


var bufPool = sync.Pool{
New: func() any {
return new(bytes.Buffer) // Вызывается только если пул пуст
},
}

func process() {
// Берем буфер из пула и кастуем к нужному типу
buf := bufPool.Get().(*bytes.Buffer)

// Гарантируем очистку и возврат буфера
defer func() {
buf.Reset() // Очищаем старые данные!
bufPool.Put(buf)
}()

// ... работаем с buf ...
}



#golang #backend #performance #память

📲 Мы в MAX

👉 @golang_lib
  • 👍 1
  • 🔥 1
More from @golang_lib
  1. Sep 22, 2026🔴AI кодинг интервью с разработчиком из международного FinTech в четверг в 19:00 ДА! Вайбк…
  2. Sep 21, 2026📢 sync.Cond: Как разбудить 10 000 горутин одним вызовом (и не сломать планировщик) Предст…
  3. Sep 17, 2026🔎 pprof: Как найти функцию, которая жрет 80% CPU Сервис на проде внезапно упирается в пол…
  4. Sep 7, 2026🗺️ sync.Map: Почему эта «серебряная пуля» иногда пробивает дно производительности Как тол…
  5. Sep 2, 2026☢️ Пакет unsafe: Взламываем систему типов Go Пакет unsafe - это легальный способ сказать к…
  6. Sep 1, 2026🔴 Тестовое собеседование с Go Senior с опытом работы в Яндексе, EPAM и Uzum в этот четвер…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →