我们使用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 app代码中的变量)。这样我就可以释放引用并让GC在它的循环中收集它。是否有可视化heapdump的最新工具?或者有更好的方法解决这个问题吗?
答案 0 :(得分:2)
目前,您的问题还没有完整的解决方案。 newest heap dump format解释了运行时不再跟踪以前可用的某些信息。
Go Issue 16410有很多有关正在进行的工作的详细信息和信息。
一个工具 - 正在进行的工作 - 可能会有所帮助goheapdump
答案 1 :(得分:-2)
您可以使用net/pprof
包。只需按照https://blog.golang.org/profiling-go-programs中的步骤转储堆/ cpu配置文件。
您可以使用go tool pprof binary dumpfile
来分析转储文件。在交互式分析工具中键入web
,您可以在Web浏览器中查看调用图。