2020-09-24更新
修复文章的问题:
- 去除使用
time.Ticker
方法修复bug,不符合select超时逻辑 - 以前使用go tool pprof分析内存占用方法是错误的,现在已经更改过来了。
原文链接:
读者说我的代码有内存泄漏的风险mp.weixin.qq.com![29e92c110b591f605d1bd672ed2e5234.png](https://i-blog.csdnimg.cn/blog_migrate/f4989dcfde65d7274404cf1a2826254d.png)
前言
嗨,大家好,我是asong,我今天又来了。昨天发表了一篇文章: 手把手教姐姐写消息队列,其中一段代码被细心的读者发现了有内存泄漏的危险,确实是这样,自己没有注意到这方面,追求完美的我,马上进行了排查并更改了这个bug
。现在我就把这个bug
分享一下,避免小伙伴们后续踩坑。
测试代码已经放到了github: https:// github.com/asong2020/Go lang_Dream/tree/master/code_demo/time_oom_validate
欢迎star~~~
背景
我先贴一下会发生内存泄漏的代码段,根据代码可以更好的进行讲解:
func (b *BrokerImpl) broadcast(msg interface{}, subscribers []chan interface{}) {
count := len(subscribers)
concurrency := 1
switch {
case count > 1000:
concurrency = 3
case count > 100:
concurrency = 2
default:
concurrency = 1
}
pub := func(start int) {
for j := start; j < count; j += concurrency {
select {
case subscribers[j] <- msg:
case <-time.After(time.Millisecond * 5):
case <-b.exit:
return
}
}
}
for i := 0; i &l