【发布时间】:2011-07-16 15:53:38
【问题描述】:
我在使用 C#/WPF 应用程序时遇到了一些 OutOfMemoryExceptions,并且在尝试分析内存使用情况时遇到了一些令人困惑的数据。
当应用程序正常运行时,Windows 任务管理器显示内存使用量大约为 34 MB(在创建对象和垃圾收集时略有反弹)。当我运行 CLR Profiler 和 dotTrace Memory 等内存分析应用程序时,它们显示的总内存使用量约为 1.2 MB。
为什么会有这么大的差异?任务管理器看到这些分析器没有看到什么?
更新:我向我的应用程序添加了一些诊断代码,以通过 Process 类每隔一段时间打印出各种内存信息。
在运行我的应用程序时,我在DebugDiag 中设置了一条规则,以便在发生异常时执行内存转储。我强制异常并且发生了内存转储。此时,我的应用程序的内存使用量(如任务管理器所示)从 32 MB 跃升至 145 MB 并保持不变。
您可以在下表 (WorkingSet64) 中看到这种跳转。我仍在尝试理解 Process 类提供的所有类型的内存信息。外部应用程序如何使我的应用程序的工作集像这样增长?
【问题讨论】:
-
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