检测混合环境中的内存泄漏(Managed-Unmanaged)

时间:2012-06-15 06:53:33

标签: wpf memory-leaks unmanaged managed

我是用VC ++ MFC 6.0编写的应用程序。最近通过在vs2008中编译升级到.NET 3.5,并通过使用托管和非托管环境向其添加了一些WPF应用程序。基本上在win32窗口上托管WPF。如果我只是打开一个WPF应用程序窗口,内存会持续上升到1KB / 10秒。我尝试过使用.NET Memory Profiler&蚂蚁记忆探查器。但两者都无法帮我检测泄漏!我已从托管的WPF应用程序中删除了所有WPF控件。它只包含一个只有一个框架的页面。但仍然发生泄漏!!有人请帮助我什么可能导致应用程序内存上升?

3 个答案:

答案 0 :(得分:5)

首先,您应该确定是否存在托管内存泄漏或本机内存泄漏:

使用这些PerfMon计数器来执行此操作:

  1. 流程/私有字节,
  2. .NET CLR内存/所有堆中的字节数
  3. .NET CLR LocksAndThreads /当前逻辑线程数。
  4. 如果1增加,但2保持稳定,则会出现本机内存泄漏。 如果1和2正在增加,则会出现托管内存泄漏。

    如果3意外增加,则线程堆栈正在泄漏。

    如果您发现了托管内存泄漏,那么像Ants,YourKit等.NET内存分析器工具应该有所帮助。由于它们对您的情况没有帮助,您可能有本机泄漏。

    重要说明:确保在查看内存消耗之前手动调用垃圾收集器。如果没有足够的内存压力,GC将无法运行并且您的进程内存增加(在这种情况下这不是泄漏。)像这样调用GC:

    GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();
    

答案 1 :(得分:1)

本文介绍了WPF内存问题的一些常见原因 - 可能值得一读:

http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/learning-memory-management/WPF-Silverlight-pitfalls

关于使用内存分析器查找泄漏的尝试,请尝试以下ANTS:

1)分开两分钟或两分钟(分析器每次拍摄快照之前自动运行垃圾收集)。

2)确保基线快照设置为快照1,最后一个快照设置为快照2。

3)转到班级列表。

4)在“基本过滤器”下,选择“从当前快照仅显示新对象”。

5)突出显示最大的类,然后转到实例列表。

6)对于其中一个实例,打开实例保留图,该图显示将该实例保存在内存中的引用链。

7)运气好的话,你会看到一个物体抓住它不应该固定的东西。如果没有,请重复步骤5& 6但选择不同的类/实例。

答案 2 :(得分:1)

好吧,经过一些灵魂搜索,发现泄漏实际上是由于框架中的错误造成的。 阅读本文了解更多 http://social.msdn.microsoft.com/Forums/zh/wpf/thread/5b9ae245-9067-4ca4-b846-180db9f7bde5