Функция runtime.ReadMemStats

Функция runtime.ReadMemStats заполняет переданную в нее структуру типа runtime.MemStats информацией о выделенной памяти и работе сборщика мусора. Она принимает указатель на структуру и записывает в нее данные о текущем состоянии памяти. Функция приостанавливает выполнение программы на время сбора статистики, чтобы получить согласованные показатели. Используйте эту функцию для мониторинга, отладки или создания инструментов профилирования.

Синтаксис

goruntime.ReadMemStats(&stats)

Пример

Получение базовой информации о выделенной памяти:

gopackage main

import (
  "fmt"
  "runtime"
)

func main() {
  var stats runtime.MemStats
  runtime.ReadMemStats(&stats)

  fmt.Printf("Alloc: %v bytes\n", stats.Alloc)
  fmt.Printf("TotalAlloc: %v bytes\n", stats.TotalAlloc)
  fmt.Printf("NumGC: %v\n", stats.NumGC)
}

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

go"Alloc: 188928 bytes"
"TotalAlloc: 188928 bytes"
"NumGC: 0"

Пример

Получение статистики сборщика мусора и времени пауз:

gopackage main

import (
  "fmt"
  "runtime"
  "time"
)

func main() {
  var stats runtime.MemStats
  runtime.ReadMemStats(&stats)

  fmt.Printf("GC pause total: %v ns\n", stats.PauseTotalNs)
  fmt.Printf("Number of GC cycles: %v\n", stats.NumGC)

  if stats.NumGC > 0 {
    lastPause := stats.PauseNs[(stats.NumGC-1)%256]
    fmt.Printf("Last GC pause: %v ns\n", lastPause)
  }
}

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

go"GC pause total: 0 ns"
"Number of GC cycles: 0"

Пример

Получение информации о куче и количестве выделенных объектов:

gopackage main

import (
  "fmt"
  "runtime"
)

func main() {
  var stats runtime.MemStats
  runtime.ReadMemStats(&stats)

  fmt.Printf("HeapAlloc: %v bytes\n", stats.HeapAlloc)
  fmt.Printf("HeapObjects: %v\n", stats.HeapObjects)
  fmt.Printf("HeapInUse: %v bytes\n", stats.HeapInuse)
}

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

go"HeapAlloc: 188928 bytes"
"HeapObjects: 0"
"HeapInUse: 1310720 bytes"

Пример

Использование ReadMemStats для сравнения использования памяти до и после выделения:

gopackage main

import (
  "fmt"
  "runtime"
)

func main() {
  var stats runtime.MemStats

  runtime.ReadMemStats(&stats)
  before := stats.Alloc

  // Создаем срез для демонстрации
  data := make([]byte, 1024*1024) // 1 MB
  for i := range data {
    data[i] = byte(i % 256)
  }

  runtime.ReadMemStats(&stats)
  after := stats.Alloc

  fmt.Printf("Memory before: %v bytes\n", before)
  fmt.Printf("Memory after: %v bytes\n", after)
  fmt.Printf("Difference: %v bytes\n", after-before)
}

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

go"Memory before: 188928 bytes"
"Memory after: 1296832 bytes"
"Difference: 1107904 bytes"

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

  • структуру runtime.MemStats,
    которая содержит все поля статистики памяти
  • функцию runtime.GC,
    которая запускает сборку мусора вручную
  • функцию runtime.NumGoroutine,
    которая возвращает количество текущих горутин
  • функцию runtime.GOMAXPROCS,
    которая управляет количеством используемых процессоров