1

我有一个内存不断增长的程序。我不确定这是内存泄漏还是只是一个不断增长的缓冲区。

我成功隔离了问题,但还是找不到问题。

有一些奇怪的行为:如果我移除压缩部分,泄漏就会消失。所以我假设它在那里。但是,如果我(仅)删除开关中带有 chanTest 的子句,泄漏也会消失。有人可以确认这个问题并解释我为什么它有这样的行为吗?我正在使用 go1.0.3

谢谢!

这是程序:(它每 100 毫秒压缩一些虚拟数据)

package main

import (
    "bytes"
    "compress/zlib"
    "fmt"
    "time"
)

func main() {
    timeOut := time.NewTicker(100 * time.Millisecond)
    chanTest := make(chan int32)

    for {       
        L: for {  // timer part
            select {
                case resp := <- chanTest: // strange clause
                    fmt.Println("received stuff", resp)
                case <-timeOut.C:
                    fmt.Println("break")
                    break L
                }
           }
        timeOut = time.NewTicker(100 * time.Millisecond)

        // compression part
        data := []byte{1, 2, 3, 4, 5, 6, 7}
        var b bytes.Buffer
        w := zlib.NewWriter(&b)
        w.Write(data)
        w.Close()

        b.Reset()
    }
}
4

2 回答 2

3

您正在循环内开始一个新的 Ticker 而不调用.Stop()原始代码。由于 Ticker 以一定间隔运行,因此您最终会得到多个 Ticker 继续同时运行。

调用.Stop()停止前一个在技术上是可行的:

timeOut.Stop()
timeOut = time.NewTicker(100 * time.Millisecond)

...但似乎违背了它的目的。相反,只是不要在循环中创建新的 Ticker,原来的将继续运行:

// timeOut = time.NewTicker(100 * time.Millisecond) // not needed
于 2013-02-05T17:08:21.853 回答
2

在 2013 年 2 月 25 日(修订版 1c50db40d078)更新的 golang 提示中有针对此问题的修复。如果您运行hg pull; hg update更新 Go 的源代码并重新编译您的 Go 发行版,那么内存消耗问题应该会消失。

但是,仅此一项并不能使程序正确-它仅修复了异常高的内存消耗。需要调用正确的实现timeout.Stop()

于 2013-02-06T07:43:59.077 回答