1
  1. 我运行dumpheap -type MyObjectType命令来获取MyObjectType. 它显示堆上的三个对象。
  2. 我跑去dumpheap -mt <method table address>找地址。
  3. 我运行!gcroot <address>命令来查找对这些对象的引用,什么也没找到
  4. !do <address>它提供了有关此对象等字段的详细信息。

如何找到正在引用或使用对象的线程?有什么命令可以找出来吗?

4

2 回答 2

1

没有简单的方法可以做到这一点,但是您可以!dso为每个线程运行(即~*!dso)。这将告诉您每个线程引用了哪些对象。为了帮助导航输出,我通常将其记录到文件中并使用 grep 或体面的文本编辑器来搜索结果。

于 2011-12-01T15:46:01.877 回答
0

您可能会尝试使用Microsoft 的 CLR Profiler来找出分配和访问您的对象的线程。我不确定是否!gcroot显示等待终结器的对象,但 CLR Profiler 肯定会。您的对象也可能根本没有被任何 GC 根引用,它只是在等待收集发生。这可能需要相当长的时间,特别是如果它是在 LOB 堆中分配的。尝试强制执行几次 GC(并查看 gen0-2 收集是否实际发生)并查看您的对象是否存活。

于 2011-11-29T18:56:47.740 回答