Правильный способ обнаружения утечек памяти в игре, написанной на Go - PullRequest
0 голосов
/ 04 октября 2019

Я пишу игру на Go. Мне сказали, что в моем коде течет память. Каков будет правильный подход для точного определения причины утечек?

Я знаю, pprof существует, но, насколько я знаю, его можно использовать, когда ваше приложение использует пакет http и мое приложение. это простая игра, и она не использует никакой связи с сетью.

Ответы [ 3 ]

2 голосов
/ 04 октября 2019

Безусловно, вы можете создавать профили без http-сервера, используя пакет runtime / pprof . Также есть github.com / pkg / profile Дэйва Чейни, обертка для среды выполнения / pprof с более простым API. Например, вы можете использовать обработчики сигналов для включения и отключения профилирования.

При этом ничто не мешает вам запустить HTTP-сервер, только для pprof. Я считаю, что это гораздо удобнее, потому что тогда вы можете легко создать любой профиль по требованию.

// +build debug

package main

import (
    "log"
    "net/http"
    _ "net/http/pprof/"
)

func init() {
    log.Println("Launching pprof server")
    go func() { log.Fatal(http.ListenAndServe("localhost:3030", nil)) }()
}

При этом используется тег сборки, поэтому вы можете включить сервер в разработке, но исключить его из производственных сборок. Скомпилируйте с -tags debug, чтобы включить сервер. Подробнее см. Построение ограничений .

2 голосов
/ 04 октября 2019

Помимо pprof, обсуждавшегося ранее, также может быть полезно проверить heap выделение , выполнив escape-анализ вашего кода (например, если file is main.go) с помощью:

go build -gcflags=-m main.go

Это сразу дает вам представление о вещах, например, если вы передаете указатели вокруг без необходимости , которых можно избежать.

Вот небольшая статья , в которой рассматриваются различные способы повышения эффективности вашей программы.

0 голосов
/ 04 октября 2019

Вы можете использовать пакет https://golang.org/pkg/runtime/pprof/ для записи профилей памяти на диск (вы можете сделать это, скажем, раз в минуту). После этого просто запустите go tool pprof (режим inuse_space) на нескольких из них и посмотрите, есть ли некоторые части, где inuse_space растет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...