查找Windows应用程序的真实内存占用情况

我已经遇到了一些OutOfMemoryExceptions与我的C#/ WPF应用程序,我遇到了一些混乱的数据,而试图分析内存使用情况。

当应用程序通常运行时,Windows任务pipe理器显示内存使用量为34 MB左右(稍微反弹,因为创build对象和垃圾收集)。 当我运行内存分析应用程序(如CLR Profiler和dotTrace Memory)时 ,它们显示的总内存使用量约为1.2 MB。

为什么这个巨大的差异? 什么是任务pipe理器看到这些configuration文件不?

更新:我添加了一些诊断代码到我的应用程序打印出每一个经常通过Process类的各种内存信息。

在运行我的应用程序时,我在DebugDiag中设置了一个规则来在发生exception时执行内存转储。 我强迫一个exception,并发生内存转储。 在这一点上,我的应用程序(如任务pipe理器所示)的内存使用从32 MB跳到145 MB,并保持在那里。

你可以在下面的表格中看到这个跳转(WorkingSet64)。 我仍然试图理解Process类提供的所有types的内存信息。 外部应用程序如何使我的应用程序的工作集像这样增长?

链接到数据表在这里。

使用这里建议的一些诊断工具,加上蚂蚁内存分析器 (这是钱),我发现泄漏的来源。

  1. 在.NET 3.5下,WPF Storyboard动画泄漏
  2. WPF BitmapEffect类可能会导致泄漏。 替代“效果”类修复了泄漏。 链接 , 链接
  3. XAML合并ResourceDictionaries可能会导致泄漏。 链接 , 链接
  4. 应用程序(由任务管理器显示的内存)的“工作集”内存占用不是您的进程的足迹的好迹象。 外部应用程序可以影响这个 链接

内存分析工具帮助我发现泄漏主要是在非托管代码中,这使得追查真正的痛苦。 处理这些泄漏,加上更好地理解Windows内存(私人与工作集)清除了事情。

Prcess Explorer和VMMap ,都是由Mark Russinovich提供的Sysinternals Suite的一部分。