如何可视化heapdump?

问题描述 投票:0回答:3

我们使用 golang 开发了一个服务器,它将接收并发请求并处理请求(创建大对象 - 树),然后发回回复。但这些对象不会被垃圾回收。所以我决定分析内存中的对象。首先,我编写了一个简单的程序

package main

import (
    "fmt"
    "io/ioutil"
    "os"
    "runtime/debug"
)

func main() {
    var i_am_a int = 10
    _ = i_am_a
    func() {
        f, err := os.Create("dump")
        defer f.Close()
        if err != nil {
            panic(err)
        }
        debug.WriteHeapDump(f.Fd())
    }()

    b, err := ioutil.ReadFile("dump")
    if err != nil {
        panic(err)
    }
    fmt.Print(string(b))

}

但我无法理解其表示(https://github.com/golang/go/wiki/heapdump13 - 这没有帮助)。我想要的只是从内存(大对象)追溯到保存对象根地址的位置(go 应用程序代码中的变量)。这样我就可以释放引用并让 GC 在其循环中收集它。有没有最新的工具可以可视化heapdump?或者有更好的方法来解决这个问题吗?

debugging go garbage-collection heap-dump
3个回答
3
投票

目前还没有完整的解决方案可以解决您的问题。 最新的堆转储格式解释了运行时不再跟踪以前可用的一些信息。

Go Issue 16410 有大量有关正在进行的工作的详细信息和信息。

一个工具(正在进行中的工作)可能会有所帮助,那就是 goheapdump


0
投票

这是另一个问题 https://github.com/golang/go/issues/57447 旨在彻底改革 Go 堆分析


-4
投票

您可以使用

net/pprof
包。只需按照 https://blog.golang.org/profiling-go-programs 中的步骤即可转储堆/CPU 配置文件。

您可以使用

go tool pprof binary dumpfile
来分析转储文件。在交互式分析工具中输入
web
,您可以在网络浏览器中看到调用图。

© www.soinside.com 2019 - 2024. All rights reserved.