【问题标题】:Right way of finding memory leaks in game written in Go在用 Go 编写的游戏中查找内存泄漏的正确方法
【发布时间】:2019-10-04 01:00:29
【问题描述】:

我正在用 Go 编写游戏。有人告诉我我的代码正在泄漏内存。查明泄漏原因的正确方法是什么?

我知道 pprof 存在,但据我所知,当您的应用程序使用 http 包并且我的应用程序是一个简单的游戏并且它不使用任何网络连接时,可以使用它。

【问题讨论】:

  • pprof中没有这个限制,不管有没有网络都可以使用。见golang.org/pkg/net/http/pprof
  • 如果您提及有关游戏的一些细节,尤其是它的 gui 部分,这可能会很有用。

标签: go memory memory-leaks


【解决方案1】:

您当然可以使用runtime/pprof package 在没有http 服务器的情况下创建配置文件。还有由 Dave Cheney 编写的 github.com/pkg/profile,它是 runtime/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 编译以启用服务器。详情请见Build Constraints

【讨论】:

    【解决方案2】:

    除了之前讨论的 pprof 之外,通过对代码进行转义分析(例如,如果文件是 main.go)来检查 heap allocation 也可能很有用作者:

    go build -gcflags=-m main.go

    这会立即让您了解一些事情,例如您是否在 不必要地 周围传递 指针,这是可以避免的。

    Here is a short article 可以通过各种方式让你的程序更有效率。

    【讨论】:

      【解决方案3】:

      您可以使用https://golang.org/pkg/runtime/pprof/ 包在磁盘上写入内存配置文件(假设一分钟一次)。之后只需在其中几个上运行go tool pprof(inuse_space 模式),看看是否有一些部分 inuse_space 正在增长

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-15
        • 2017-11-29
        • 2011-08-27
        • 1970-01-01
        相关资源
        最近更新 更多