我有一个程序,内存不断增长。我不确定这是内存泄漏还是只是不断增长的缓冲区。我已成功隔离问题,但仍然找不到问题。会有一些奇怪的行为:如果我移除压缩部分,泄漏将消失。因此,我认为它在那里。但是,如果我(仅)删除开关中带有 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
翻过高山走不出你
TA贡献1875条经验 获得超3个赞
在高于2013年2月25日(修订1c50db40d078)的golang提示中已解决此问题。如果您运行hg pull; hg update
以更新 Go 的源代码并重新编译您的 Go 发行版,那么内存消耗问题应该会消失。
但是,仅此一项并不能使程序正确-只能解决异常高的内存消耗。需要调用正确的实现timeout.Stop()
。
- 2 回答
- 0 关注
- 165 浏览
添加回答
举报
0/150
提交
取消