内存消耗激增

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

我已成功隔离问题,但仍然找不到问题。

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

这是程序:(每100ms压缩一些伪数据)


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()

    }

}


交互式爱情
浏览 166回答 2
2回答

holdtom

您正在循环内启动新的股票代号,而无需调用.Stop()原始代号。由于股票行情是以一定的间隔运行的,因此最终您会导致多个股票行情同时继续运行。呼吁.Stop()停止以前的人会在技术上的工作:timeOut.Stop()timeOut&nbsp;=&nbsp;time.NewTicker(100&nbsp;*&nbsp;time.Millisecond)......但似乎违背了它的目的。相反,只是不要在循环中创建新的股票代号,而原始代币将继续运行://&nbsp;timeOut&nbsp;=&nbsp;time.NewTicker(100&nbsp;*&nbsp;time.Millisecond)&nbsp;//&nbsp;not&nbsp;needed

翻过高山走不出你

在高于2013年2月25日(修订1c50db40d078)的golang提示中已解决此问题。如果您运行hg pull; hg update以更新 Go 的源代码并重新编译您的 Go 发行版,那么内存消耗问题应该会消失。但是,仅此一项并不能使程序正确-只能解决异常高的内存消耗。需要调用正确的实现timeout.Stop()。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go