2

以下是我检查对象 0330e9a8 的 gcroot。我发现它的根是一个句柄,它的类型是“RefCnt”。

我怎样才能得到它的实际引用计数。我怎么知道哪个对象获得了它的引用?

0:042> !GCRoot 0330e9a8 
Note: Roots found on stacks may be false positives. Run "!help gcroot" for
more info.
Scan Thread 5 OSTHread 534
Scan Thread 8 OSTHread 60c
Scan Thread 9 OSTHread 1120
Scan Thread 10 OSTHread 1b30
Scan Thread 11 OSTHread 52c
Scan Thread 12 OSTHread 1da8
Scan Thread 15 OSTHread 1cbc
Scan Thread 19 OSTHread 1808
Scan Thread 22 OSTHread 1b6c
Scan Thread 23 OSTHread 1e70
Scan Thread 0 OSTHread 1a34
Scan Thread 32 OSTHread 1840
DOMAIN(001C1050):HANDLE(RefCnt):d31460:Root:0330edf8(xxxxxxx)->
0330eedc(xxxxxxxxxxxx)->
0330e9a8(xxxxxxxxxxxxxx)
4

1 回答 1

2

它是一个 GC 句柄,使非托管代码可以访问 .NET 对象。
例如:订阅 COM 对象事件。

运行 !gcroot 时您通常会看到哪些类型的根,它们是什么意思?
ESP: ESP=Extended Stack Pointer,对象正在堆栈上使用
Strong:强引用,通常是静态变量
WeakLn:弱长句柄,通过终结跟踪的弱引用(可以复活)
WeakSh:弱短句柄,A弱引用,无法复活
Pinned: Pinned 对象,固定在特定地址,垃圾回收时不能四处移动。
RefCnt:引用计数,只要引用计数>0就被引用。

请参阅:.NET 调试演示实验室 7:内存泄漏 - 回顾

于 2012-10-16T16:59:00.700 回答