GoLang数据记录器(带宽)内存泄漏

时间:2016-03-09 00:50:58

标签: logging go

我试图找到内存泄漏,我已将其归零到这部分代码,但我无法找到内存泄漏的位置或如何修复它,当我有一些人调查它们,他们认为它与" tickers"如上所述: https://golang.org/src/time/tick.go 它"泄漏"。关于修复的任何想法?

谢谢! :)

answer = 0

1 个答案:

答案 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?