Я не могу понять, почему память не освобождена. Профиль памяти показывает, что почти вся память используется runtime.malg. Если я удаляю диапазон по каналу в DoSomeWork, все работает отлично.Ошибка утечки Golang Gotoutine
Здесь на выходе 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)
}
Работа по сбору мусора не освободить память. Это 'm.Sys' вас беспокоит? – JimB
m.Alloc фактически – Hepri
Почему? Вот сколько памяти кучи вы использовали. Снова GC не освобождает память, это делает кукуруза. Меня больше беспокоит, что вы выделили 2 ГБ стека. – JimB