Есть ли способ узнать, кто держит ссылку на объект в Go?
В настоящее время я пытаюсь отладить неприятную утечку памяти в нашем коде Go.
Что я знаю:
- куда идет память (
pprof
с флагом -base
) - почему выделяется новая память (функция "переподключиться" в нашем коде)
- количество горутин не растет (
runtime.NumGoroutine()
) - если я сделаю
object = nil
, память будет собирать мусор (хорошо! но теперь у меня есть гонки данных с другими подпрограммами, которые используют этот объект)
Что я не знаю:
- почему новая память не собирается сборщиком мусора. для этого мне нужно знать, кто имеет ссылку на объект.
Спасибо за ваше время и за любые советы!
Ответы
Ответ 1
Ваш код 404 не найден.
Когда вы ставите объект = ноль. это не было очищено немедленно, однако, когда некоторая goroutine все еще держит это, объект будет оставаться неподвижным, даже если gc работает.
Вы спрашиваете, у кого есть ссылка, goroutine, который использует этот val, не помещая его в ноль, или goroutine использует его в цикле, оба сохранят ссылку.
Gc() никогда не помечает указанную ссылку на черный, тогда это никогда не будет ясно