【发布时间】:2009-04-29 09:25:39
【问题描述】:
上下文: 我们正在构建一个快速交付 WPF 应用程序的框架。该框架使用 Autofac 作为 IoC 容器,还使用 Prism v1 中的区域。我们正在使用 Microsoft 的 Parallel 扩展来安排任务。
我们面临以下问题: 当我们用空视图启动应用程序时(所以只是一个带有区域和占位符控件的外壳),内存将保持稳定约 60 秒,然后它将每秒增加 4kb,然后是 4kb,然后是 8kb。所以每 3 秒我们的内存压力就会增加 16Kb。
我们试图追踪泄漏的原因是什么。 我开始使用 dotTrace,但我看不出相隔 30 分钟拍摄的 2 个快照之间有任何区别。 继续使用 .NET 内存分析器,因为它为我提供了更多信息,但我们再次看不到 2 个快照之间的任何差异。 我们可以看到创建了许多对象,但它们也被删除了,导致 delta 为 0。 所以我继续使用windbg,但结果是一样的。
另一件奇怪的事情是,当我们启动 sysinternals dbgvw 时,我们看不到在我们的应用程序中进行任何调用。
您对我们下一步可能尝试找出什么/谁是罪魁祸首有什么建议吗?
【问题讨论】:
-
您使用什么指标来确定内存在增加?
-
我同意您需要定义用于衡量内存使用的指标,您还确定分配是托管还是非托管?
-
我查看了进程的堆内存和私有字节。快速浏览一下 perfmon 告诉我,非托管内存正在增加很多,而托管内存仅偶尔增加一次(大约每分钟),并且字节数非常少。非托管内存增长得更快。我最初通过 sysinternals 和 taskmanager 的进程资源管理器查看内存是否在增加。我们的应用程序有大量的跟踪语句,因此我们可以确定运行的不是应用程序代码
-
我会使用进程资源管理器或来自 Sysinternals 的handles.exe 来查看它。查看您是否泄漏了任何系统句柄以及它们是什么类型(如果您有 Windows 7,则内置的资源资源管理器有此信息)。您描述的行为与我最近在我的一个应用中看到的句柄泄漏一致。
标签: c# wpf memory-leaks prism autofac