Есть ли способ узнать, кто держит ссылку на объект в Go?

В настоящее время я пытаюсь отладить неприятную утечку памяти в нашем коде Go.

Что я знаю:

  • куда идет память (pprof с флагом -base)
  • почему выделяется новая память (функция "переподключиться" в нашем коде)
  • количество горутин не растет (runtime.NumGoroutine())
  • если я сделаю object = nil, память будет собирать мусор (хорошо! но теперь у меня есть гонки данных с другими подпрограммами, которые используют этот объект)

Что я не знаю:

  • почему новая память не собирается сборщиком мусора. для этого мне нужно знать, кто имеет ссылку на объект.

Спасибо за ваше время и за любые советы!

Ответы

Ответ 1

Ваш код 404 не найден.

Когда вы ставите объект = ноль. это не было очищено немедленно, однако, когда некоторая goroutine все еще держит это, объект будет оставаться неподвижным, даже если gc работает.

Вы спрашиваете, у кого есть ссылка, goroutine, который использует этот val, не помещая его в ноль, или goroutine использует его в цикле, оба сохранят ссылку.

Gc() никогда не помечает указанную ссылку на черный, тогда это никогда не будет ясно