Golang程序调试 -- 内存泄漏pprof工具

代码引入pprof

import (
	"net/http"
	_ "net/http/pprof"
)
func main() {
	go func() {
		http.ListenAndServe("0.0.0.0:60001", nil)
	}()
	//...
	select {}
}

上述事例我暴露出得端口号为60001,可自定义一个未使用的端口号即可

WEB访问模式

直接打开浏览器输入http://ip:60001/debug/pprof
上述的IP为程序所执行的环境暴露的IP地址;

命令行模式定位内存

#可访问目标主机的linux系统或者本机
go tool pprof -inuse_space http://ip:60001/debug/pprof/heap
#查看
#(pprof) top
top
#命令结果会显示排行前十的内存占用函数通过
#(pprof) list <函数名>可以查看到详细的信息
list runtime.malg

命令行模式定位耗时

#可访问目标主机的linux系统或者本机
go tool pprof -inuse_space http://ip:60001/debug/pprof/profile
#查看
#(pprof) top
top
#命令结果会显示排行前十的内存占用函数通过
#(pprof) list <函数名>可以查看到详细的信息
list runtime.scanobject

命令行模式定位内存分配

#可访问目标主机的linux系统或者本机
go tool pprof -inuse_space http://ip:60001/debug/pprof/allocs
#查看
#(pprof) top
top
#命令结果会显示排行前十的内存占用函数通过
#(pprof) list <函数名>可以查看到详细的信息
list runtime.scanobject

# 命令行模式定位协程泄漏
```shell
#可访问目标主机的linux系统或者本机
go tool pprof -inuse_space http://ip:60001/debug/pprof/goroutine
#查看
#(pprof) top
top
#命令结果会显示排行前十的内存占用函数通过
#(pprof) list <函数名>可以查看到详细的信息
list runtime.scanobject

# 命令行模式定位锁竞争
```shell
#可访问目标主机的linux系统或者本机
go tool pprof -inuse_space http://ip:60001/debug/pprof/mutex
#查看
#(pprof) top
top
#命令结果会显示排行前十的内存占用函数通过
#(pprof) list <函数名>可以查看到详细的信息
list runtime.scanobject
### 关于 Go pprof 内存泄漏分析 Go 提供了一个强大的工具 `pprof`,它能够帮助开发者调查并定位内存问题。通过掌握此工具,可以有效地发现潜在的内存泄漏情况[^1]。 #### 使用 pprof 进行内存泄漏检测 为了利用 `pprof` 分析内存泄漏,通常需要执行以下操作: 1. **启用 HTTP Profiler** 在应用程序中引入标准库中的 `net/http/pprof` 包即可自动注册默认的 `/debug/pprof/` 路由。这样可以通过浏览器或命令行访问这些路由获取性能数据。 ```go import _ "net/http/pprof" ``` 2. **收集堆栈样本** 堆栈采样可以帮助识别哪些部分占用了过多的内存资源。以下是采集堆信息的一个简单方法: ```bash go tool pprof http://<your-app-address>/debug/pprof/heap ``` 3. **可视化分析** 收集到的数据可以用多种方式展示出来,比如火焰图(Flame Graphs),以便更直观地理解内存分配模式及其上下文关系。例如,在交互式终端下输入 top 或者 list 查看具体函数调用链路详情;也可以导出 SVG 文件进一步研究复杂场景下的行为特征。 4. **对比前后状态变化趋势** 定期保存不同时间点上的快照文件,并将其加载至同一会话当中比较差异之处,则更容易察觉是否存在持续增长却未释放的现象——即所谓的“泄露”。 #### 示例代码片段 下面给出一段简单的例子演示如何设置以及启动内置 web server 来支持远程诊断功能: ```go package main import ( "log" "net/http" _ "net/http/pprof" // Importing net/http/pprof enables profiling over HTTP. ) func handler(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello PProf!")) } func main() { http.HandleFunc("/", handler) log.Println("Starting server on :6060") err := http.ListenAndServe(":6060", nil) if err != nil { log.Fatalf("Could not start server: %v\n", err) } } ``` 运行上述程序之后,就可以通过访问地址 `localhost:6060/debug/pprof/` 获取各种类型的 profile 数据了。 --- 尽管本文主要讨论的是 Golang 中针对内存管理方面的问题解决策略,但是值得注意的是还有其他类似的工具和技术可用于不同的目的。例如 C++ 的 gprof 工具被用来做 CPU 性能剖析工作[^2] ,而某些情况下甚至可能需要用到低级调试手段如反汇编指令来深入探究特定条件下发生的事情 [^3]. 另外对于那些关心自己开发的应用到底是在什么样的环境下被执行的人来说,也有专门的方法去判断目标机器究竟是真实的硬件设备还是一种模拟出来的计算平台或者是某种形式隔离单元内的实例化表现形态等问题存在探讨价值 [^4].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值