【问题标题】:Track down memory leak in WPF跟踪 WPF 中的内存泄漏
【发布时间】: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


【解决方案1】:

如果您正在寻找非托管泄漏并且正在使用 Visual Studio,则可以使用内置的 crt 函数获得非常有用的信息:

an answer to a related question

【讨论】:

    【解决方案2】:

    事实证明这是 WPF 内部的一个错误,解决方法是创建一个窗口处理程序作为第一个对象或其他东西。 谢谢大家

    【讨论】:

    • 你能把你在哪里找到这个信息发给别人吗?从您的评论中不清楚解决方法是什么。我的直觉说您在 STA 线程中运行 WCF 服务器,它无法完成某些资源,但不清楚。
    • 这是一个 wpf 请求,不幸的是,在网络上根本找不到该信息。我们记录了与微软的支持电话,他们花了大约一周的时间才找到问题所在。我现在已经离开了那个客户,所以我不能去看看解决方法是什么。 WCF 是 IIS 托管的顺便说一句,但与该问题无关。
    • 这实际上在下面的博客文章中记录了它的编号 8(如果初始 HWND 在 XP 上被破坏,CMilChannel 泄漏)。 blogs.msdn.com/jgoldb/archive/2008/02/04/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 2012-10-14
    相关资源
    最近更新 更多