我是用VC ++ MFC 6.0编写的应用程序。最近通过在vs2008中编译升级到.NET 3.5,并通过使用托管和非托管环境向其添加了一些WPF应用程序。基本上在win32窗口上托管WPF。如果我只是打开一个WPF应用程序窗口,内存会持续上升到1KB / 10秒。我尝试过使用.NET Memory Profiler&蚂蚁记忆探查器。但两者都无法帮我检测泄漏!我已从托管的WPF应用程序中删除了所有WPF控件。它只包含一个只有一个框架的页面。但仍然发生泄漏!!有人请帮助我什么可能导致应用程序内存上升?
答案 0 :(得分:5)
首先,您应该确定是否存在托管内存泄漏或本机内存泄漏:
使用这些PerfMon计数器来执行此操作:
如果1增加,但2保持稳定,则会出现本机内存泄漏。 如果1和2正在增加,则会出现托管内存泄漏。
如果3意外增加,则线程堆栈正在泄漏。
如果您发现了托管内存泄漏,那么像Ants,YourKit等.NET内存分析器工具应该有所帮助。由于它们对您的情况没有帮助,您可能有本机泄漏。
重要说明:确保在查看内存消耗之前手动调用垃圾收集器。如果没有足够的内存压力,GC将无法运行并且您的进程内存增加(在这种情况下这不是泄漏。)像这样调用GC:
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
答案 1 :(得分:1)
本文介绍了WPF内存问题的一些常见原因 - 可能值得一读:
关于使用内存分析器查找泄漏的尝试,请尝试以下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