2012-06-15 90 views
1

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

+0

您是否在您的应用中使用了带有OnPaint方法的WPF工具? – gahcep

+0

不能给你的问题一个具体的答案,但我只想指出一个很好的文章关于追踪.Net中的内存泄漏:http://www.codeproject.com/Articles/19490/Memory-Leak-Detection-in- NET –

+0

gahcep, 没有OnPaint() – Alerter

回答

5

首先,你应该确定是否有管理的内存泄漏或本机内存泄漏:

使用这些PerfMon计数器来做到这一点:

  1. 进程/ Private字节,
  2. .NET所有堆中的CLR内存/#字节数,
  3. .NET CLR LocksAndThreads /当前逻辑线程数量。

如果1增加,但2保持稳定,则表明本机存在内存泄漏。 如果1和2增加,则说明存在受管内存泄漏。

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

如果您发现托管内存泄漏,.NET内存分析器工具(如Ants,YourKit等)应该有所帮助。由于他们没有帮助你的情况,你可能有一个本地泄漏。

重要提示:请务必在查看内存消耗之前手动调用垃圾回收器。如果没有足够的内存压力,GC将不会这样运行,您的进程的内存增加(这是不是在这种特殊情况下的泄漏。)调用GC:

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

本文介绍的一些常见原因与WPF内存问题 - 可能是值得考虑的读取:

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

关于你试图找到内存分析器泄漏,尝试用蚂蚁如下:

1)取两个快照一分钟两个分开分析器会在每次拍摄快照之前自动运行垃圾收集)。

2)确保基准快照被设置为快照1和最后的快照被设置为快照2.

3)转到类列表。

4)在'基本过滤器'下选择'从当前快照只显示新对象'。

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

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

7)有一点运气,你会看到一个对象,它坚持一些你不能修复的东西。如果不是,重复步骤5 & 6,但选择不同的类/实例。