我已经遇到了一些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的内存信息。 外部应用程序如何使我的应用程序的工作集像这样增长?
链接到数据表在这里。
使用这里建议的一些诊断工具,加上蚂蚁内存分析器 (这是钱),我发现泄漏的来源。
内存分析工具帮助我发现泄漏主要是在非托管代码中,这使得追查真正的痛苦。 处理这些泄漏,加上更好地理解Windows内存(私人与工作集)清除了事情。
Prcess Explorer和VMMap ,都是由Mark Russinovich提供的Sysinternals Suite的一部分。