我不明白为什么内存不被释放。内存配置文件显示runtime.malg使用的几乎所有内存。如果我在DoSomeWork中移除通道上的范围,一切都可以正常工作。
这里是fmt.Println的输出:
Memory Acquired: 4196600
Memory Used : 745192
Memory Acquired: 2651299576
Memory Used : 393923440源代码:
func DoSomeWork(work chan int) {
for _ = range work {
}
}
func main() {
k := make(chan int)
m := &runtime.MemStats{}
runtime.ReadMemStats(m)
fmt.Println("Memory Acquired: ", m.Sys)
fmt.Println("Memory Used : ", m.Alloc)
wg := new(sync.WaitGroup)
// generate a lot of goroutines that reads from channel
for i:=0;i<1000000;i++ {
wg.Add(1)
go func() {
DoSomeWork(k)
wg.Done()
}()
}
close(k)
wg.Wait()
// make GC
runtime.GC()
// show memory after garbage collector
runtime.ReadMemStats(m)
fmt.Println("Memory Acquired: ", m.Sys)
fmt.Println("Memory Used : ", m.Alloc)
}发布于 2016-01-15 18:05:34
您的代码中没有内存泄漏。然而,您确实会导致大量内存被保留,这就是您所看到的。
当我寻找任何泄漏时,我宁愿多做一次测试。这很容易用您的代码完成。只需添加:
func init(){
for{
main()
}
}新的输出将显示在运行过程中内存没有丢失:
Memory Acquired: 2885880
Memory Used : 14848
Memory Acquired: 2594885728
Memory Used : 297108312
Memory Acquired: 2594885728
Memory Used : 297108984
Memory Acquired: 2624143456
Memory Used : 297108312
Memory Acquired: 2624143456
Memory Used : 297108984
Memory Acquired: 2624143456
Memory Used : 297108312
Memory Acquired: 2624143456
Memory Used : 297108984
Memory Acquired: 2624143456
Memory Used : 297108312
Memory Acquired: 2624143456
Memory Used : 297108984
Memory Acquired: 2624143456
Memory Used : 297108312https://stackoverflow.com/questions/34811933
复制相似问题