go pprof工具使用

    1. import (
    2. "base-media-go/routers"
    3. "net/http"
    4. _ "net/http/pprof"
    5. )
    6. func main() {
    7. go func() {
    8. pErr := http.ListenAndServe("0.0.0.0:6060", nil)
    9. if pErr != nil {
    10. log.WithField("error", pErr).Error("go pprof failed !")
    11. }
    12. }()
    13. r := routers.Load()
    14. err := r.Run(":8894")
    15. if err != nil {
    16. log.WithField("error", err).Error("server start failed !")
    17. }
    18. }

    浏览器访问 http://localhost:6060/debug/pprof/ 如下:
    image.png
    查看具体heap allocs信息;定位相关代码;
    发现 allocs == heap 内存分配数量没有回收;

    运行build命令:
    go build -gcflags '-m -l -l' server.go
    image.png
    几个结论:
    1.魔术字符串 var a =””,会发生逃逸.
    2.log和fmt会发生逃逸,返回指针类型的函数,会逃逸。
    3.传递指针类型的变量不会逃逸

    查看进程实际使用内存:
    docker stats ``d174db4f7f67
    image.png
    查看内存分配
    docker container top d174db4f7f67 获取 pid

    cat /proc/18413/status 查看内存分配