2016-01-15 2 views
0

Я не могу понять, почему память не освобождена. Профиль памяти показывает, что почти вся память используется 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) 
} 
+1

Работа по сбору мусора не освободить память. Это 'm.Sys' вас беспокоит? – JimB

+0

m.Alloc фактически – Hepri

+1

Почему? Вот сколько памяти кучи вы использовали. Снова GC не освобождает память, это делает кукуруза. Меня больше беспокоит, что вы выделили 2 ГБ стека. – JimB

ответ

1

Там нет утечки памяти в коде. Однако вы действительно заставляете много памяти резервироваться, и это то, что вы видите.

Когда я ищу утечку, я предпочитаю делать тест более одного раза. Это легко сделать с кодом. Просто добавьте:

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 : 297108312 
Смежные вопросы