跟踪内存中的.NET对象

时间:2011-12-30 13:24:48

标签: c# .net visual-studio-2010 debugging reference

我正在使用AvalonDock在C#/ .NET中编写一个编辑器。

如果我关闭文档,我的程序的内存消耗不会减少。即使我手动调用垃圾收集器。所以我假设某个地方仍然有文件的参考。

软件很庞大,文档是一个非常核心的组件,所以要找到每个引用都不容易。

Visual Studio 2010调试器是否具有在内存中搜索某个类的对象的功能?

或者,如果遇到这样的问题,你会怎么做?

3 个答案:

答案 0 :(得分:7)

您需要使用内存分析器来查找内存中的对象以及对它们的引用。

several different options - 广告和免费。

答案 1 :(得分:2)

你可以使用免费工具做你想做的事。

基本步骤如下:

  1. 运行您的应用程序
  2. 将windbg附加到其进程
  3. 加载“sos”辅助模块(.loadby sos mscorwks)
  4. 转储堆(!DumpHeap -stat)
  5. 找到您感兴趣的类型,看看它是否真的是使用内存的东西
  6. 转储特定类型的堆(!DumpHeap -type MyNameSpace.MyType)
  7. 找到您认为应该处理的对象的内存地址,并查看它是否在某处“扎根”。 (!gcroot“无论地址是什么”)
  8. 我在跟踪图形密集型c#程序中的内存泄漏时,亲自使用这种技术。

    我是从微软的Rico Mariani那里学到的。这是一篇博客文章,详细描述了它。 * http://blogs.msdn.com/b/ricom/archive/2004/12/10/279612.aspx

答案 2 :(得分:0)

请记住,即使.net清理自己,Windows也可能不会决定实际释放内存。通常它只在另一个应用程序实际需要内存时才这样做。所以,使用内存分析器:)