我的一个线上程序,出现内存泄露问题,运行3-5天后内存居高不下,远超出该程序本应该占用的内存,我把出问题的这段代码贴出来,请大家帮忙看一下问题所在
<iframe style="border:1px solid" src="https://wide.b3log.org/playground/d1c55222ea6c82c14ed6359e8f6cb9d1.go" width="99%" height="600"></iframe>
在程序运行一段时间后,我使用go pprof查看goroutine和heap使用情况,发现heap异常:
heap profile: 15926: 918443936 [252871: 990891280] @ heap/1048576
15393: 630497280 [15559: 637296640] @ 0x40f4f1 0x4054b3 0x403a95 0x401dc3 0x468961
0x4054b2 main.createSessionWithUrl+0x1992
0x403a94 main.createSession+0x1a4
0x401dc2 main.handleConnection+0x9d2
35: 280125440 [35: 280125440] @ 0x40f4f1 0x40574e 0x403a95 0x401dc3 0x468961
0x40574d main.createSessionWithUrl+0x1c2d
0x403a94 main.createSession+0x1a4
0x401dc2 main.handleConnection+0x9d2
这是heap的使用情况,可以看到这两个heap占用内存比较大,第一个heap有15393个对象,对应代码第55行,第2个heap有35个对象,对应代码第68行。
然后我查看goroutine情况,发现确实有35个startSessionProxy的goroutine,这符合我们的期望,
但是handleConnection这个goroutine只有694个,按道理一个handleConnection的goroutine应该对应一个gateServerConn对象,
也就是一个gateServerConn.gateChan对象,而我们看heap信息得到的gateChan数量是15393,
远远对不上,数毫无疑问是有内存泄露存在,但是我没有找到什么地方存在泄露,请大家帮帮忙!
我认为是这样
当 sessionChanMap[sessionAddr] = sessionChan后,如果goroutine结束后没有在map中将对应的sessionAddr del掉,gc就不会将sessionChan释放,内存就会泄露
#2