go pprof工具使用
import (
"base-media-go/routers"
"net/http"
_ "net/http/pprof"
)
func main() {
go func() {
pErr := http.ListenAndServe("0.0.0.0:6060", nil)
if pErr != nil {
log.WithField("error", pErr).Error("go pprof failed !")
}
}()
r := routers.Load()
err := r.Run(":8894")
if err != nil {
log.WithField("error", err).Error("server start failed !")
}
}
浏览器访问 http://localhost:6060/debug/pprof/
如下:
查看具体heap allocs信息;定位相关代码;
发现 allocs == heap 内存分配数量没有回收;
运行build命令:go build -gcflags '-m -l -l' server.go
几个结论:
1.魔术字符串 var a =””,会发生逃逸.
2.log和fmt会发生逃逸,返回指针类型的函数,会逃逸。
3.传递指针类型的变量不会逃逸
查看进程实际使用内存:docker stats ``d174db4f7f67
查看内存分配docker container top d174db4f7f67
获取 pid
cat /proc/18413/status
查看内存分配