Профилирование кучи и выделения памяти
Поиск горячих участков памяти с помощью профилей кучи
«Профилирование кучи и выделения памяти» — бесплатный урок Go Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Зачем нужно профилирование кучи
Чрезмерное количество выделений памяти замедляет программы на Go из-за нагрузки на сборщик мусора. Профилирование кучи показывает, какие пути выполнения выделяют больше всего памяти, чтобы можно было сократить число выделений.
Снятие профиля кучи
Через конечную точку HTTP (требуется net/http/pprof):
go tool pprof http://localhost:6060/debug/pprof/heapПрофиль кучи в файл
Запишите профиль кучи в любой момент с помощью runtime/pprof:
f, _ := os.Create("mem.prof")
pprof.WriteHeapProfile(f)
f.Close()Inuse и alloc
Профиль кучи имеет два представления: inuse_objects/inuse_space (объекты и память, используемые сейчас) и alloc_objects/alloc_space (итоги с момента запуска). Используйте alloc_space, чтобы найти наиболее активные пути выделения памяти.
go tool pprof -alloc_space http://localhost:6060/debug/pprof/heapgo test -memprofile
Снимите профиль памяти во время Benchmark:
go test -memprofile mem.prof -benchmem -bench=BenchmarkProcess ./...MemStats
Программно считывайте статистику памяти среды выполнения для мониторинга в реальном времени:
var ms runtime.MemStats
runtime.ReadMemStats(&ms)
fmt.Printf("Alloc: %v MiB\n", ms.Alloc/1024/1024)
fmt.Printf("NumGC: %v\n", ms.NumGC)Анализ逃ивания переменных
Переменные, которые перемещаются в кучу, вызывают выделение памяти. Запустите go build -gcflags=-m, чтобы увидеть, какие переменные перемещаются в кучу и почему.
go build -gcflags="-m -m" ./...
// main.go:12:15: &User{...} escapes to heapСокращение выделений: предварительное выделение
Предварительно выделяйте срезы с помощью make([]T, 0, n), если известна итоговая длина. Это позволяет избежать повторного выделения памяти при росте среза.
results := make([]Result, 0, len(input))sync.Pool для повторного использования
Помещайте повторно используемые объекты (буферы, временные срезы) в sync.Pool, чтобы распределить стоимость выделения памяти:
var pool = sync.Pool{
New: func() any { return new(bytes.Buffer) },
}
buf := pool.Get().(*bytes.Buffer)
buf.Reset()
// use buf...
pool.Put(buf)Получатели-значения и получатели-указатели
Большие структуры, передаваемые по значению, копируются при каждом вызове. Передавайте их по указателю, чтобы избежать копирования, но помните: указатели могут привести к перемещению значения в кучу.
String и []byte
Преобразование между string и []byte приводит к выделению памяти. Используйте []byte на всех горячих путях и преобразуйте в string только на границе, где требуется строка.
Быстрая проверка
Что показывает -alloc_space в профиле кучи pprof?
Итоги: профилирование кучи
Основные положения:
- -alloc_space показывает общий объём выделений; inuse_space — объём памяти, используемый сейчас
- go build -gcflags=-m показывает результаты анализа перемещения в кучу
- Предварительно выделяйте срезы; используйте sync.Pool для частого повторного использования
- Используйте runtime.ReadMemStats для программного мониторинга
Изучай Go с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 51
- Уроки
- 203
Часто задаваемые вопросы
Урок «Профилирование кучи и выделения памяти» бесплатный?
Да — полный текст урока «Профилирование кучи и выделения памяти» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Профилирование кучи и выделения памяти»?
Поиск горячих участков памяти с помощью профилей кучи Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Профилирование кучи и выделения памяти»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Написание тестов производительности с testing.B
- Профилирование CPU с pprof
- Профилирование кучи и выделения памяти
- Трассировка выполнения