Ответ
При аллокации в Go управление памятью происходит через механизм escape analysis и runtime-аллокатор.
-
Стек vs Куча:
- Если переменная не "убегает" из функции, она аллоцируется на стеке (быстро, автоматическое освобождение).
- Если переменная передаётся за пределы функции (например, возвращается или сохраняется в глобальную переменную), она попадает в кучу (управляется GC).
-
Аллокатор:
- Go использует собственный аллокатор на основе TCMalloc (Thread-Caching Malloc).
- Память разбивается на spans (блоки по 8КБ), которые делятся на объекты разного размера.
Пример:
func foo() *int {
x := 42 // x "убегает" – аллоцируется в куче
return &x
}
Нюансы:
- Escape analysis можно проверить через
go build -gcflags="-m". - Малые объекты (<32КБ) аллоцируются в локальных кэшах (P-аллокатор), что минимизирует блокировки.