【问题标题】:How to visualize heapdump?如何可视化堆转储?
【发布时间】:2017-01-09 07:13:18
【问题描述】:

我们使用 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 在它的循环中收集它。是否有可视化堆转储的最新工具?或者有没有更好的方法来解决这个问题?

【问题讨论】:

  • 这个链接可以帮助您进行 Go 内存分析吗? software.intel.com/en-us/blogs/2014/05/10/…
  • @JeandeyBoris,我已经尝试过这些技巧。但是,它们都没有真正的帮助。唯一有用的信息是我无法理解的堆转储。

标签: debugging go garbage-collection heap-dump


【解决方案1】:

目前,您的问题没有完整的解决方案。 newest heap dump format 解释说,一些以前可用的信息不再被运行时跟踪。

Go Issue 16410 有很多关于正在进行的工作的细节和信息。

goheapdumpgoheapdump

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 你能解释一下分析将如何帮助我找到没有被垃圾回收的对象吗?
    • @Spartan 最初的问题不是看堆转储吗?由于您已经能够可视化堆,因此您可以找出占用堆空间的确切内容。并且通常堆中占用大量空间的对象被认为不是垃圾回收,这使您可以找出它是否是由于循环引用引起的。
    猜你喜欢
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 2011-01-26
    • 2013-09-02
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 2013-10-01
    相关资源
    最近更新 更多