一、产生原因

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如何排查内存泄露问题。

五、参考链接