为了账号安全,请及时绑定邮箱和手机立即绑定

内存消耗激增

内存消耗激增

Go
交互式爱情 2021-05-09 12:43:15
我有一个程序,内存不断增长。我不确定这是内存泄漏还是只是不断增长的缓冲区。我已成功隔离问题,但仍然找不到问题。会有一些奇怪的行为:如果我移除压缩部分,泄漏将消失。因此,我认为它在那里。但是,如果我(仅)删除开关中带有 chanTest 的子句,泄漏也会消失。有人可以确认问题并向我解释为什么会有这种行为吗?我正在使用go1.0.3这是程序:(每100ms压缩一些伪数据)package mainimport (    "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()    }}
查看完整描述

2 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

您正在循环内启动新的股票代号,而无需调用.Stop()原始代号。由于股票行情是以一定的间隔运行的,因此最终您会导致多个股票行情同时继续运行。

呼吁.Stop()停止以前的人会在技术上的工作:

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

......但似乎违背了它的目的。相反,只是不要在循环中创建新的股票代号,而原始代币将继续运行:

// timeOut = time.NewTicker(100 * time.Millisecond) // not needed


查看完整回答
反对 回复 2021-05-31
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

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

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


查看完整回答
反对 回复 2021-05-31
  • 2 回答
  • 0 关注
  • 165 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信