2011-03-16 32 views
2

我已经遇到了一些OutOfMemoryExceptions与我的C#/ WPF应用程序,并且在尝试分析内存使用情况时遇到了一些令人困惑的数据。查找Windows应用程序的真实内存占用

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

为什么这个巨大的差异?任务管理器看到这些配置文件没有看到什么?

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

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

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

Link to data table here.

+2

CLR Profiler不显示非托管内存。进程本身和运行时使用内存。您可以使用vadump http://blogs.msdn.com/b/maoni/archive/2004/11/08/tools-that-help-diagnose-managed-memory-related-issues.aspx查看更具体的内存如何使用或使用来自techne/sysinternals的briljant进程管理器http://technet.microsoft.com/en-us/sysinternals/bb896653 – rene 2011-03-16 14:47:47

+1

为什么如此低使用率的内存错误?也许你的问题实际上是内存腐败。 – 2011-03-16 14:57:41

+0

我会看看其他配置文件,谢谢。该应用程序运行的平台是一个只有512 MB内存的小型平板电脑。这也是一个基于闪存的硬盘驱动器,因此分页被禁用。还有其他应用程序正在同时运行,因此我试图充分理解内存使用情况。 – BabaBooey 2011-03-16 15:04:26

回答

8

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

  1. WPF Storyboard animations leak under .NET 3.5
  2. 的WPF BitmapEffect类可引起泄漏。替代的“效果”类修复了泄漏。 Link,Link
  3. XAML合并的ResourceDictionaries可能导致泄漏。 LinkLink
  4. 应用程序的“工作集”内存占用情况(由任务管理器显示的内存)不是您的进程足迹的良好指示。外部应用程序可以影响此。 Link

的内存分析工具,帮助我找到了泄漏大多在非托管代码,这使它成为真正的痛苦追查。处理这些泄漏,加上对Windows内存(私人与工作集)的更好理解,已经清除了一些事情。

相关问题