что это значит, когда у объекта нет корня, использующего !gcroot с SOS?

#c# #windbg #sos

#c# #windbg #sos

Вопрос:

Я отслеживаю утечку памяти, в которой я использую

!dumpheap -stat !dumpheap -mt !gcroot

однако !gcroot ничего не показывает, я думал, это означает, что у объекта нет ссылок, но он не был собран. но я не уверен на 100%.

 0:018> !dumpheap -mt 000007fee15f0bb0     
         Address               MT     Size
000000001c87b570 000007fee15f0bb0  3145752     
000000001cb7b588 000007fee15f0bb0  3145752     
000000001e9675a8 000007fee15f0bb0  3145752     
000000001ec675c0 000007fee15f0bb0  3145752   


0:018> !gcroot 000000001ec675c0 
Note: Roots found on stacks may be false positives. Run "!help gcroot" for
more info.
Scan Thread 0 OSTHread 1eb4
Scan Thread 2 OSTHread 1c60
Scan Thread 4 OSTHread 1370
Scan Thread 6 OSTHread d5c
Scan Thread 7 OSTHread 740
Scan Thread 10 OSTHread 40c
Scan Thread 14 OSTHread 20d4
Scan Thread 15 OSTHread 398
Scan Thread 16 OSTHread 214c
Scan Thread 17 OSTHread 2538
  

Ответ №1:

Отсутствие корня означает, что объект недоступен.

Когда объект недоступен, сборщик мусора считает объект мусором и может быть собран.

Объект, не имеющий корня в какой-то момент своего жизненного цикла, является нормальным явлением, фактически необходимым для того, как работает сборка мусора.

Ссылки: