Golang goroutine无限循环内存泄漏

时间:2017-03-30 18:39:43

标签: go memory-leaks

我遇到了奇怪的(对于一个刚接触golang的男人)我的goroutine的行为:

go func(...) {
  for {
    buffer := make([]byte, 1024)
     ...
  } 
}

慢慢吃RAM。我知道这是由无限循环中调用make引起的;它只是每次都分配新的内存。但我不明白为什么这个建筑:

  var buffer []byte
  for {
    buffer = make([]byte, 1024)
     ...
    }
  } 

..效果很好,而第一个没有。垃圾收集器是否应该检测到旧buf指向的内存在两种情况下都无法访问?也许还有一些其他类似的陷阱,新手应该知道吗?

另外,如果我将返回这个goroutine,泄露的内存会被释放吗?

UPD :完整内存泄漏例程代码:

go func(dataChannel chan []byte, errorChannel chan error) {
  for {
    buf := make([]byte, 1024)
    _, err := conn.Read(buf) 
    if err != nil {
      errorChannel<- err
      break
    }
    dataChannel<- buf
  } 
} (dataChannel, errorChannel)

2 个答案:

答案 0 :(得分:0)

  for {
        var mem runtime.MemStats
        runtime.ReadMemStats(&mem)
        fmt.Printf("alloc [%v] \t heapAlloc [%v] \n", mem.Alloc, mem.HeapAlloc)
        time.Sleep(2000 * time.Millisecond)
    }
  • 在主函数for循环中添加了上述行(在上面给出的泄漏代码链接中)
  • 新代码:https://pastebin.com/UQbYuVN7
  • 运行时显示gc
  • 定期重新收集内存

答案 1 :(得分:-2)

感谢 JimB 以及他对设置环境变量df.fillna(method='ffill') 的建议,我发现我的系统中没有设置env var GOGC,因为垃圾收集器并非如此功能完全。将其设置为default value就是我需要的一切。