- 我运行
dumpheap -type MyObjectType
命令来获取MyObjectType
. 它显示堆上的三个对象。 - 我跑去
dumpheap -mt <method table address>
找地址。 - 我运行
!gcroot <address>
命令来查找对这些对象的引用,什么也没找到 !do <address>
它提供了有关此对象等字段的详细信息。
如何找到正在引用或使用对象的线程?有什么命令可以找出来吗?
dumpheap -type MyObjectType
命令来获取MyObjectType
. 它显示堆上的三个对象。dumpheap -mt <method table address>
找地址。!gcroot <address>
命令来查找对这些对象的引用,什么也没找到!do <address>
它提供了有关此对象等字段的详细信息。如何找到正在引用或使用对象的线程?有什么命令可以找出来吗?
没有简单的方法可以做到这一点,但是您可以!dso
为每个线程运行(即~*!dso
)。这将告诉您每个线程引用了哪些对象。为了帮助导航输出,我通常将其记录到文件中并使用 grep 或体面的文本编辑器来搜索结果。
您可能会尝试使用Microsoft 的 CLR Profiler来找出分配和访问您的对象的线程。我不确定是否!gcroot
显示等待终结器的对象,但 CLR Profiler 肯定会。您的对象也可能根本没有被任何 GC 根引用,它只是在等待收集发生。这可能需要相当长的时间,特别是如果它是在 LOB 堆中分配的。尝试强制执行几次 GC(并查看 gen0-2 收集是否实际发生)并查看您的对象是否存活。