Получить доступ

Как в Go устроены сборка мусора и размещение на стеке или в куче?

MiddleПамять и GC
Ещё спрашивают так:
  • Что такое escape analysis в Go?
  • Что настраивают GOGC и GOMEMLIMIT?
Коротко

GC в Go — конкурентный mark-and-sweep без поколений и без перемещения объектов, с паузами в доли миллисекунды. Где разместить значение, решает escape analysis компилятора: не «убегает» из функции — на стек (бесплатно), иначе — в кучу (работа для GC). GOGC задаёт частоту сборок, GOMEMLIMIT — мягкий лимит памяти.

  • go build -gcflags=-m показывает, что убегает в кучу
  • Убегают: возврат указателя, сохранение в интерфейс или замыкание, слишком большие значения
  • sync.Pool — переиспользовать временные объекты в горячем коде

А ещё GOMEMLIMIT (1.19) в контейнере — меньше риск OOM-kill

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Сборщик. Трёхцветная маркировка выполняется параллельно с программой, короткие остановки нужны только на начало и конец фазы. Барьер записи отслеживает изменения ссылок. Объекты не перемещаются, поэтому нет уплотнения — вместо него аллокатор с классами размеров.

GOGC=100 (по умолчанию): следующая сборка, когда куча вырастет на 100% от живых данных после предыдущей. Больше — реже сборки, больше памяти. GOMEMLIMIT — при приближении к лимиту GC работает чаще, удерживая память; полезно в контейнерах с жёстким лимитом.

Escape analysis:

func newUser() *User {
    u := User{}   // убегает: возвращается указатель → куча
    return &u
}
func sum(xs []int) int {
    total := 0    // остаётся на стеке
    ...
}

Снижение нагрузки на GC: меньше аллокаций в горячем коде — предвыделять срезы, возвращать значения вместо указателей для мелких структур, strings.Builder, sync.Pool для буферов. Профиль аллокаций — pprof -alloc_space.

Что хотят услышать

  • Свойства сборщика Go.
  • Escape analysis и как его посмотреть.
  • GOGC и GOMEMLIMIT.

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем