Что выведет код Senior Память, GC и pprof обновлено
Что выведет Go: подслайс держит весь массив
Вопрос
Что выведет программа? Go 1.23, в go.mod указано go 1.23.
package main
import "fmt"
func main() {
big := make([]byte, 1<<20)
small := big[:8]
clone := append([]byte(nil), big[:8]...)
fmt.Println(len(small), cap(small), len(clone), cap(clone) < 1024)
}
Попробуйте сами
Напишите, что выведет код: каждый вывод с новой строки.
Показать ответ и разбор
Коротко
Код выведет: 8 1048576 8 true. Подслайс small смотрит в тот же мегабайтный массив: ёмкость 1 МиБ, и пока он жив, GC не освободит массив.
Что выведет
8 1048576 8 true
Разбор
Подслайс small смотрит в тот же мегабайтный массив: ёмкость 1 МиБ, и пока он жив, GC не освободит массив. Копия через append получает свой маленький массив (точная ёмкость зависит от округления аллокатора, но она маленькая). Так избавляются от удержания памяти.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Память, GC и pprof»
- Пул объектов как sync.Pool: симуляция на Go
- Статистика потока чисел без хранения на Go
- Escape analysis: что попадёт в кучу
- Как работает сборщик мусора Go
- Какой сборщик мусора в Go
- Как посмотреть решения escape analysis
- Что значит GOGC=100
- GOMEMLIMIT в контейнере