Вопрос с собеседования · Go

Как в 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

Подробно

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

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.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Конкурентный mark-and-sweep; escape analysis решает, стек или куча
  • ✗Поколенческий перемещающий GC; всё, что создано через new, всегда попадает в кучу
  • ✗Все значения в Go размещаются в куче
  • ✗GOGC задаёт жёсткий лимит памяти процесса

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования