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

时间:2011-03-16 14:42:43

标签: wpf windows memory profiler

我在C#/ WPF应用程序中遇到了一些OutOfMemoryExceptions,在尝试分析内存使用情况时,我遇到了一些令人困惑的数据。

当应用程序通常运行时,Windows任务管理器会将内存使用量显示为大约34 MB(在创建对象和收集垃圾时略微反弹)。当我运行内存分析应用程序(例如CLR ProfilerdotTrace Memory)时,它们显示总内存使用量大约为1.2 MB。

为什么会出现这种巨大的差异?任务管理器看到这些分析器没有什么用?

更新:我在应用程序中添加了一些诊断代码,以便经常通过Process类打印出各种内存信息。

在运行我的应用程序时,我在DebugDiag中设置了一个规则,以便在发生异常时执行内存转储。我强制异常并发生内存转储。此时,我的应用程序的内存使用量(由任务管理器显示)从32 MB跳到145 MB并保持不变。

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

Link to data table here.

2 个答案:

答案 0 :(得分:8)

使用这里建议的一些诊断工具,再加上ANTS memory profiler(这是钱),我找到了泄漏的来源。

  1. WPF Storyboard animations leak under .NET 3.5
  2. WPF BitmapEffect类可能导致泄漏。替代“效果”类修复了泄漏。 LinkLink
  3. XAML Merged ResourceDictionaries可能导致泄漏。 LinkLink
  4. 应用程序的“工作集”内存占用空间(任务管理器显示的内存)不能很好地指示您的进程占用空间。外部应用可以影响这一点。 Link
  5. 内存分析工具帮助我发现泄漏主要是在非托管代码中,这使得追踪成为一种真正的痛苦。处理这些泄漏,加上对Windows内存的更好理解(私有与工作集)可以解决问题。

答案 1 :(得分:5)

Prcess ExplorerVMMap,这两部分都是Mark Russinovich的Sysinternals Suite