💻 Про детектор утечек горутин — 4 июля 2026 г. в 10:11:00.800
💻 Про детектор утечек горутин Горутина утекает, когда блокируется на канале или локе, который никто никогда не освободит, и висит до конца жизни процесса. В Go 1.27 для таких случаев в runtime/pprof добавляют профиль goroutineleak. Предложение приняли ещё в апреле, родом оно из Uber, оттуда же, откуда и популярная uber-go/goleak. Главная идея в том, что детектор ездит на сборщике мусора. Горутина считается утёкшей, если канал или лок, на котором она стоит, недостижим ни из одной живой горутины, ни из тех, что живые могли бы разбудить. Разбудить её нечем, и GC помечает её как утечку. Отсюда же её главное отличие от goleak. Профиль строит доказательство достижимости и работает на живом процессе без ложных срабатываний, тогда как goleak делает снимок на завершении теста и на проде путает реальные утечки с горутинами, которые просто ждут следующего запроса. API крошечный. Никаких новых типов и функций, только профиль с именем goroutineleak, который читается обычными инструментами pprof. Снять его можно четырьмя привычными способами: • прямо из кода через pprof.Lookup("goroutineleak").WriteTo(...) • в тесте по аналогии с VerifyNone • по HTTP через net/http/pprof • через go tool pprof. Пока что профиль за флагом сборки, запускать нужно с GOEXPERIMENT=goroutineleakprofile, в релизе 1.27 флаг уберут. Из-за правила «никаких ложных срабатываний» GC не трогает горутину, если её канал или лок всё ещё достижим. Но глобальная переменная или локали живой горутины могут держать этот канал достижимым ещё долго после того, как к нему реально кто-то обратится в последний раз. Такая горутина останется непомеченной. Всё, что профиль показывает, это настоящие утечки. Просто часть настоящих утечек он не покажет.

