Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有办法知道谁持有对某个对象的引用?_C#_.net_Memory Leaks_Garbage Collection - Fatal编程技术网

C# 有没有办法知道谁持有对某个对象的引用?

C# 有没有办法知道谁持有对某个对象的引用?,c#,.net,memory-leaks,garbage-collection,C#,.net,Memory Leaks,Garbage Collection,有没有办法知道谁持有对某个对象的引用 在我调用GC.Collect之后,我发现我的对象并没有被d'tor最终确定。在代码中无法有效地完成这项工作。追踪此类泄漏的最佳方法是使用WinDbg之类的工具。SOS扩展有几个专门设计用于帮助追踪内存泄漏的命令 Rico就这个主题写了一篇详尽的博客: 您应该在GC.Collect之后调用,以允许垃圾收集器清除freachable队列。由于GC在另一个线程中运行,因此当GC试图完成任何需要完成的对象时,应用程序可能已经移动。通过调用,您将强制当前线程等待,

有没有办法知道谁持有对某个对象的引用


在我调用GC.Collect之后,我发现我的对象并没有被d'tor最终确定。

在代码中无法有效地完成这项工作。追踪此类泄漏的最佳方法是使用WinDbg之类的工具。SOS扩展有几个专门设计用于帮助追踪内存泄漏的命令

Rico就这个主题写了一篇详尽的博客:

您应该在
GC.Collect
之后调用,以允许垃圾收集器清除freachable队列。由于GC在另一个线程中运行,因此当GC试图完成任何需要完成的对象时,应用程序可能已经移动。通过调用,您将强制当前线程等待,直到GC完成清除freachable队列(需要终结的项目队列)后再继续执行


尽管如此,我同意Joel Coehoorn的评论——GC在你不使用它的情况下工作得最好。

除了Windbg,你还可以使用.net分析器。我已经做到了这两个方面——配置文件不会告诉你Windbg不能告诉你的任何事情,但是一个好的配置文件会更友好一些

Windbg 除了来自JaredPar的链接外,Tess Ferrandez还有一些关于将Windbg与.net结合使用的优秀文章。下面是一篇关于内存泄漏的文章:

探查器: 我很幸运地使用了SciTech的profiler(不过,我没有任何附属关系,这是一个很棒的工具):


他们的网站上也有一些很棒的操作视频。

你为什么打电话给GC.Collect?不要担心清理内存,对于内存以外的资源,您应该实现IDisposable并处理它们。我在下面给出了答案,但我假设您调用GC.Collect()是为了调试。除此之外,我同意Joel的观点——让GC担心何时收集。手动调用可能会导致比修复问题更多的问题。请更正。我调用GC.Collect()只是为了调试。我想确保我的目标最终确定下来。