Go Academy · Урок

Профилирование кучи и выделения памяти

Поиск горячих участков памяти с помощью профилей кучи

Урок 3 из 413 шагов

«Профилирование кучи и выделения памяти» — бесплатный урок 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/heap

go 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 — локальная установка не требуется.

Все уроки этого курса

  1. Написание тестов производительности с testing.B
  2. Профилирование CPU с pprof
  3. Профилирование кучи и выделения памяти
  4. Трассировка выполнения
← Назад к Go Academy