我遇到了奇怪的(对于一个刚接触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)
答案 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)
}
答案 1 :(得分:-2)
感谢 JimB 以及他对设置环境变量df.fillna(method='ffill')
的建议,我发现我的系统中没有设置env var GOGC,因为垃圾收集器并非如此功能完全。将其设置为default value就是我需要的一切。