Goroutine 泄露本质上是 Goroutine 阻塞在某个操作上,永远无法唤醒,导致其占用的内存(初始约 2KB)无法被 GC 回收。
常见场景
- 发送到无缓冲的 Channel,但没有接收方:Goroutine 永远阻塞在发送操作。
- 请求超时,接收方已退出:在处理 HTTP 请求时开启了 Goroutine 进行长耗时操作,如果客户端断开连接或超时,而后台 Goroutine 没有监听
context.Done(),就会持续运行并在最后试图通过 channel 通信时阻塞。
解决对策
永远将 Context 向下传递,并时刻警惕阻塞操作。利用 pprof 的 goroutine profile 定期监控线上状态。