Что происходит под капотом при аллокации

«Что происходит под капотом при аллокации» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При аллокации в Go управление памятью происходит через механизм escape analysis и runtime-аллокатор.

  1. Стек vs Куча:

    • Если переменная не "убегает" из функции, она аллоцируется на стеке (быстро, автоматическое освобождение).
    • Если переменная передаётся за пределы функции (например, возвращается или сохраняется в глобальную переменную), она попадает в кучу (управляется GC).
  2. Аллокатор:

    • Go использует собственный аллокатор на основе TCMalloc (Thread-Caching Malloc).
    • Память разбивается на spans (блоки по 8КБ), которые делятся на объекты разного размера.

Пример:

func foo() *int {
    x := 42  // x "убегает" – аллоцируется в куче
    return &x
}

Нюансы:

  • Escape analysis можно проверить через go build -gcflags="-m".
  • Малые объекты (<32КБ) аллоцируются в локальных кэшах (P-аллокатор), что минимизирует блокировки.