Go 1.27、本番環境でも動くgoroutineリーク検出プロファイラを導入

Goroutine Leak Profiles

Go 1.27、本番環境でも動くgoroutineリーク検出プロファイラを導入

Go 1.27で、稼働中のプログラムからgoroutineリークを検出する新しいプロファイラが導入される。GCの到達可能性解析を応用し、channelやsyncパッケージのプリミティブで永久にブロックされたgoroutineを精度高く特定。goleakやsynctestでは難しかった本番環境での検出を可能にする。

goroutineが、他のどのgoroutineからもアクセスできない並行性プリミティブ上でブロックされているなら、それは明らかにリークしている。
  1. deathanatos

    私は主に他の言語から来ているので、様々なバグが何なのかを理解するのに少し時間がかかった。

    • チャネルはデフォルトで「バッファなし」であり、送信が実際に行われるには待機中の受信が必要で、それまでブロックする。バッファを追加するとブロックが防がれ、goroutineが進行できる(そして最終的に終了し、したがってリークしない)… バッファが十分に大きい限りは。

    • 私の知る限り、チャネルは受信側が消えたことを認識せず、受信側がいなくても無期限にブロックする。(送信側/受信側で同じ「chan」オブジェクトだと思う/区別はない。したがって、その単一のオブジェクトは決してGCされない。)

    • goroutineはGCされない。(そしてコードはgoroutineへの参照やハンドルを保持できない/「join」プリミティブは存在しない。)

  2. sethammons

    一般的なルール:どのように終了するかを理解せずにgoroutineを呼び出してはならない。

この日のほかの記事

2026-09-19