Функция pprof.WriteHeapProfile

Функция pprof.WriteHeapProfile записывает профиль выделения памяти (heap profile) в переданный io.Writer. Она принимает один аргумент - писатель, в который будет сохранен профиль в формате, понятном для утилит go tool pprof. Эта функция полезна для сохранения снимка состояния памяти в определенный момент выполнения программы.

Синтаксис

gopprof.WriteHeapProfile(w io.Writer) error

Пример простого использования

Давайте запишем профиль кучи в файл heap.prof:

gopackage main

import (
  "os"
  "runtime/pprof"
)

func main() {
  f, err := os.Create("heap.prof")
  if err != nil {
    panic(err)
  }
  defer f.Close()

  err = pprof.WriteHeapProfile(f)
  if err != nil {
    panic(err)
  }
}

После выполнения кода в текущей директории появится файл heap.prof с профилем памяти.

Пример с выделением памяти

Давайте создадим нагрузку на память и запишем профиль:

gopackage main

import (
  "fmt"
  "os"
  "runtime/pprof"
)

func main() {
  // Выделяем память
  slice := make([]int, 1000000)
  for i := range slice {
    slice[i] = i
  }
  fmt.Println("Memory allocated")

  // Записываем профиль
  f, err := os.Create("heap.prof")
  if err != nil {
    panic(err)
  }
  defer f.Close()

  err = pprof.WriteHeapProfile(f)
  if err != nil {
    panic(err)
  }
  fmt.Println("Heap profile written")
}

Результат выполнения кода:

go"Memory allocated"
"Heap profile written"

Пример с использованием bytes.Buffer

Давайте запишем профиль в буфер памяти вместо файла:

gopackage main

import (
  "bytes"
  "fmt"
  "runtime/pprof"
)

func main() {
  buf := &bytes.Buffer{}
  err := pprof.WriteHeapProfile(buf)
  if err != nil {
    panic(err)
  }
  fmt.Printf("Profile size: %d bytes\n", buf.Len())
}

Результат выполнения кода:

go"Profile size: 1234 bytes"

Пример с обработкой ошибок

Давайте корректно обработаем возможные ошибки записи:

gopackage main

import (
  "fmt"
  "os"
  "runtime/pprof"
)

func main() {
  f, err := os.Create("heap.prof")
  if err != nil {
    fmt.Printf("Failed to create file: %v\n", err)
    return
  }
  defer f.Close()

  if err := pprof.WriteHeapProfile(f); err != nil {
    fmt.Printf("Failed to write heap profile: %v\n", err)
    return
  }
  fmt.Println("Heap profile written successfully")
}

Результат выполнения кода:

go"Heap profile written successfully"

Смотрите также

  • функцию pprof.StartCPUProfile,
    которая начинает запись CPU профиля
  • функцию pprof.StopCPUProfile,
    которая останавливает запись CPU профиля
  • функцию pprof.Lookup,
    которая возвращает профиль по имени
  • пакет net/http/pprof,
    который предоставляет HTTP интерфейс для профилирования