Выбор ответа Senior Память, GC и pprof обновлено
Почему fmt.Println вызывает аллокации
Вопрос
Почему fmt.Println(x) для локального x int часто приводит к аллокации в куче?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Аргумент упаковывается в any и убегает в кучу. Параметр ...any получает интерфейсы, и для неуказательного значения нужно место под данные.
Варианты ответа
- Println копирует весь стек горутины в кучу перед выводом
- Строковое представление x выделяется в куче, а строки в Go живут только в куче
- Println берёт мьютекс stdout, и захват мьютекса аллоцирует
- Аргумент упаковывается в
anyи убегает в кучуправильный ответ
Разбор
Параметр ...any получает интерфейсы, и для неуказательного значения нужно место под данные. Escape analysis видит, что указатель уходит в функции с рефлексией, и выносит значение в кучу. Маленькие целые 0-255 и некоторые константы рантайм берёт из статической таблицы без аллокации. Копирования стека нет, строки могут жить где угодно, мьютекс к аллокациям не относится. В горячем коде вместо fmt используют strconv и буферы.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Память, GC и pprof»
- Пул объектов как sync.Pool: симуляция на Go
- Статистика потока чисел без хранения на Go
- Escape analysis: что попадёт в кучу
- Как работает сборщик мусора Go
- Какой сборщик мусора в Go
- Как посмотреть решения escape analysis
- Что значит GOGC=100
- GOMEMLIMIT в контейнере