【问题标题】:Tracking .NET-Objects in Memory跟踪内存中的 .NET 对象
【发布时间】:2011-12-30 13:24:48
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    severaldifferentoptions - 商业和免费。

    【讨论】:

    • 有哪些免费选项,您是指免费试用吗?
    • @Meta-Knight - 我的意思是像CLR-Profiler?
    • .NET-Profilers 似乎是 ANTS 或 dotTrace 等商业工具的大市场。对于学生爱好开发者来说,这些工具太贵了。但是 CLR-Profiler 帮助我找到了问题
    【解决方案2】:

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

    基本步骤如下:

    1. 运行您的应用程序
    2. 将 windbg 附加到其进程中
    3. 加载“sos”帮助模块 (.loadby sos mscorwks)
    4. 转储堆 (!DumpHeap -stat)
    5. 找到您感兴趣的类型,看看它是否真的是使用内存的东西
    6. 为您的特定类型转储堆 (!DumpHeap -type MyNameSpace.MyType)
    7. 找到您认为应该处置的对象的内存地址,并查看它是否“植根”于某处。 (!gcroot "无论地址是什么")

    在跟踪图形密集型 c# 程序中的内存泄漏时,我亲自使用了这种技术,效果非常好。

    我从 Microsoft 的 Rico Mariani 那里学到了这一点。这是一个详细描述它的博客条目。 * http://blogs.msdn.com/b/ricom/archive/2004/12/10/279612.aspx

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2011-06-17
        • 2017-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-17
        • 2011-11-07
        • 1970-01-01
        • 2018-09-01
        相关资源
        最近更新 更多