select + time.After 导致内存暴涨
func FFFF(notRun notRun) {
for {
after.Reset(afterTime)
select {
case <-notRun.notRun:
// 大多数情况都是有notRun的输入
case <-time.After(time.Minute):
log.Printf("[ ConversationDeadline dead ]")
notRun.Close()
return
case <-notRun.run:
log.Printf("[ ConversationDeadline run ]")
notRun.Close()
return
}
}
}
- notRun 发送消息频率过快,而每次 select 都会调用到 time.After,而 time.After 又会 NewTimer,而每次 NewTimer 都必须在 1 分钟后才能释放。
- 当 notRun 的频率很高时,会在内存中堆积非常多的无用的 Timer。导致内存暴涨。
解决方法
func FFFF(notRun notRun) {
afterTime := time.Minute
after := time.NewTimer(afterTime)
defer after.Stop()
for {
after.Reset(afterTime)
select {
case <-notRun.notRun:
case <-after.C:
log.Printf("[ ConversationDeadline dead ]")
notRun.Close()
return
case <-notRun.run:
log.Printf("[ ConversationDeadline run ]")
notRun.Close()
return
}
}
}
- 自己 NewTimer 在每次 select 之前 reset,使 timer 重新计时,从而避免每次都 new timer。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于