我试图找到内存泄漏,我已将其归零到这部分代码,但我无法找到内存泄漏的位置或如何修复它,当我有一些人调查它们,他们认为它与" tickers"如上所述: https://golang.org/src/time/tick.go 它"泄漏"。关于修复的任何想法?
谢谢! :)
answer = 0
答案 0 :(得分:0)
你正在开始2 time.Ticker
并且从不停止它们,并开始2个永不返回的goroutines。每当你致电measureBandwidth
时,你就会泄漏"泄漏"那些资源。
由于您已经拥有了一个仅接收的频道,因此您应该将其用作从计数goroutine返回的信号。然后调用者将关闭返回的通道进行清理。
不需要第二个goroutine,只能用于竞争计数器以丢掉价值。计数goroutine可以跟上,如果发送到记录器的速度太慢,请将其放在自己的选择案例中。
func measureBandwidth() (bwCh chan int) {
bwCh = make(chan int, 64)
go func() {
ticker := time.NewTicker(config.DL.Interval)
defer ticker.Stop()
count := 0
for {
select {
case n, ok := <-bwCh:
if !ok {
return
}
count += n
case <-ticker.C:
DataLoggerRecords <- &DataLoggerRecord{Bytes: count}
count = 0
}
}
}()
return bwCh
}
示例:http://play.golang.org/p/RfpBxPlGeW
(次要的挑剔,通常首选使用签名类型来操作数字值,如下所示:请参阅此处进行一次此类对话:When to use unsigned values over signed ones?)