<- 返回文章列表

Go 并发:Goroutine 泄露的常见场景

Golang并发内存泄露

Goroutine 极其轻量,但这不代表你可以随意启动它而不管回收,深入探讨泄露的原因与对策。

Go 并发:Goroutine 泄露的常见场景

Goroutine 泄露本质上是 Goroutine 阻塞在某个操作上,永远无法唤醒,导致其占用的内存(初始约 2KB)无法被 GC 回收。

常见场景

  1. 发送到无缓冲的 Channel,但没有接收方:Goroutine 永远阻塞在发送操作。
  2. 请求超时,接收方已退出:在处理 HTTP 请求时开启了 Goroutine 进行长耗时操作,如果客户端断开连接或超时,而后台 Goroutine 没有监听 context.Done(),就会持续运行并在最后试图通过 channel 通信时阻塞。

解决对策

永远将 Context 向下传递,并时刻警惕阻塞操作。利用 pprof 的 goroutine profile 定期监控线上状态。