【问题标题】:Finding the true memory footprint of a Windows application查找 Windows 应用程序的真实内存占用
【发布时间】:2011-07-16 15:53:38
【问题描述】:

我在使用 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.

【问题讨论】:

  • CLR Profiler 不显示非托管内存。进程本身和运行时使用内存。您可以使用 vadump blogs.msdn.com/b/maoni/archive/2004/11/08/… 来查看更具体的内存消耗情况,或使用来自 techne/sysinternals technet.microsoft.com/en-us/sysinternals/bb896653 的 briljant 进程资源管理器
  • 为什么在使用率如此低的情况下出现内存不足错误?也许您的问题实际上是内存损坏。
  • 我会看看其他分析器,谢谢。运行应用程序的平台是一台只有 512 MB 内存的小型平板电脑。它也是一个基于闪存的硬盘驱动器,因此禁用了分页。还有其他应用程序同时运行,所以我试图全面了解内存使用情况。

标签: wpf windows memory profiler


【解决方案1】:

Prcess ExplorerVMMap,都是 Mark Russinovich 的 Sysinternals Suite 的一部分。

【讨论】:

    【解决方案2】:

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

    1. WPF Storyboard animations leak under .NET 3.5
    2. WPF BitmapEffect 类可能导致泄漏。替代的“效果”类修复了泄漏。 Link, Link
    3. XAML 合并资源字典可能导致泄漏。 Link, Link
    4. 应用程序的“工作集”内存占用量(任务管理器显示的内存量)不能很好地指示您的进程占用量。外部应用程序会影响这一点。 Link

    内存分析工具帮助我发现泄漏主要发生在非托管代码中,这使得追踪起来非常痛苦。处理这些泄漏,再加上对 Windows 内存(私有与工作集)的更好理解,一切都变得清晰起来。

    【讨论】:

      猜你喜欢
      • 2012-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-03
      • 2016-11-09
      • 2012-06-08
      • 1970-01-01
      相关资源
      最近更新 更多