一、产生原因
Golang有自动垃圾回收机制,但是仍然可能会出现内存泄漏的情况。以下是Golang内存泄漏的常见可能原因:
time.Timertime.TickerStop
二、排查方式
如果出现内存泄漏,可以使用以下方式进行分析,找出内存泄漏的原因并进行修复。
import _ "net/http/pprof"http.ListenAndServe("localhost:6060", nil)runtimeruntimeSetFinalizerReadMemStatsStackgo-torchgo vetgo vet
三、通过 pprof 的命令排查内存泄露问题
3.1 通过 pprof 的命令行分析 heap
go tool pprof -inuse_space []()
这个命令的作用是, 抓取当前程序已使用的 heap. 抓取后, 就可以进行类似于 gdb 的交互操作.
time.NewTimer
list <函数名>list time.NewTimerNewTimerruntimeTimer
for ... select ... time.After
原来程序中存在如下代码:
for {
select {
case a := <-chanA:
...
case b := <-chanB:
....
case <-time.After(20*time.Minutes):
return nil, errors.New("download timeout")
}
time.AfterNewTimertime.After
func After(d Duration) <-chan Time {
return NewTimer(d).C
}
NewTimer
downloadTimeout := time.NewTimer(20 * time.Minute)
// 添加关闭时退出操作
defer downloadTimeout.Stop()
for {
select {
case a := <-chanA:
...
case b := <-chanB:
....
case <-downloadTimeout.C:
return nil, errors.New("download timeout")
}
四、总结
通过这篇文章我们了解到Golang内存泄漏的常见可能原因有哪些:
time.Timertime.TickerStop
然后介绍了相关排查工具以及pprof如何排查内存泄露问题。