2017-01-09 65 views
2

我們開發了一個使用golang的服務器,它將接收併發請求並處理請求(創建大對象 - 樹),然後發回回覆。但這些物體並不是垃圾收集的。所以我決定分析存儲器中的物體。首先,我寫了一個簡單的程序如何可視化heapdump?

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 - 這並沒有幫助)。我只需要從內存(大對象)追溯到保存對象根地址的位置(在應用程序代碼中變量)。這樣我可以釋放參考並讓GC在它的循環中收集它。是否有最新的工具可視化heapdump?還是有更好的方法來解決這個問題?

+0

此鏈接可以幫助您進行Go記憶分析嗎? https://software.intel.com/zh-cn/blogs/2014/05/10/debugging-performance-issues-in-go-programs –

+0

@JeandeyBoris,我已經嘗試過這些技巧。但是,他們都沒有幫助。只有信息可以幫助我無法理解的Heap Dump。 – Spartan

回答

1

目前,您的問題還沒有完整的解決方案。 newest heap dump format解釋了以前可用的一些信息不再由運行時跟蹤。

Go Issue 16410有很多關於正在進行的工作的詳細信息和信息。

一個工具 - 正在進行的工作 - 這可能有助於爲goheapdump

-1

可以使用net/pprof包。只需按照https://blog.golang.org/profiling-go-programs中的步驟轉儲堆/ cpu配置文件即可。

而且您可以使用go tool pprof binary dumpfile來分析轉儲文件。在交互式分析工具中輸入web,您可以在Web瀏覽器中看到調用圖。