Chenyao

一次由于Channel buffer size导致Go内存泄漏的分析

Posted at — Mar 30, 2018

我代码里面有这么一段逻辑

func foo() int {
    ch := make(chan int)
    go func() {
        ch <- 1
    }()
    go func() {
        ch <- 2
    }()
    ret := <- ch
    return ret
}
这里问题出在make(chan int)时,默认buffer size是0,这样两个go协程在试图往ch里加东西时,如果没有消费者,其实会一直卡死等待。但是我只消费一个,所以会导致一定有一个协程没有退出,导致内存泄漏。

我是通过go tool pprof 把goroutine的占用情况找出来发现这个问题的: Imgur