【问题标题】:WPF-application memory leakWPF-应用程序内存泄漏
【发布时间】:2010-11-27 05:21:54
【问题描述】:

在 WPF 应用程序中执行某些操作(按下启动一系列计算的按钮)后发生内存泄漏(在任务管理器中的 vm 大小部分可见)大约 10 MB每次按下按钮后。

计算序列不包含错误。

内存分析器 (.NET Memory Profiler) 的使用表明 .net 中不存在泄漏,但每次按下按钮后,名称/资源部分(标记为 HeapMemory)中显示的内存大小大约增加 10 兆字节。

我已经阅读了有关 WPF 泄漏的帖子,但这些绝对不是我的情况。

有什么问题吗?有什么建议?也许,有人有同样的问题?

【问题讨论】:

标签: wpf memory memory-leaks


【解决方案1】:

看到使用的内存增加是 .NET 中用于检测内存泄漏的误称。

然而,很容易在 WPF 中造成内存泄漏。我建议使用更直观的工具,例如 Redgate Ants Memory Profiler(14 天免费试用)。使用此方法测试泄漏:

  1. 按一下按钮(以消耗您可能进行的任何热身)
  2. 拍摄快照
  3. 再次按下按钮
  4. 拍摄快照

当您转到“类列表”并检查“来自当前快照显示:仅新对象”的过滤器时。这应该让您更好地了解您是否有永远不会放手的对象。

关于 Ants Memory Profiler 的另一件事是,它到处都有视频链接,指导您如何查找泄漏。追踪泄漏有点像黑魔法,很高兴能得到帮助。

不,我不为 Redgate 工作 :)

【讨论】:

  • 发现内存泄漏是一场噩梦,但 Ants 内存分析器确实有很大帮助。我建议也阅读一下垃圾收集器。
【解决方案2】:

也许您需要使用WeakEvent Pattern as documented on MSDN 来避免泄漏?

监听事件可能导致内存泄漏。侦听事件的典型技术是使用特定于语言的语法,将处理程序附加到源上的事件。例如,在 C# 中,该语法为:source.SomeEvent += new SomeEventHandler(MyEventHandler)

此技术创建从事件源到事件侦听器的强引用。通常,为侦听器附加事件处理程序会导致侦听器具有受源对象生存期影响的对象生存期(除非显式删除事件处理程序)。但在某些情况下,您可能希望侦听器的对象生命周期仅受其他因素控制,例如它当前是否属于应用程序的可视化树,而不是由源的生命周期控制。 只要源对象的生命周期超过侦听器的对象生命周期,正常的事件模式就会导致内存泄漏:侦听器的存活时间比预期的要长。

(我的重点。)

【讨论】:

  • 问题:Re-Sharper 提供使用另一种语法,例如 source.SomeEvent += MyEventHandler。它也正确吗?
  • @Peretz:此语法与引用文本中的语法具有相同的语义。我相信是在 C# 2.0 中简化了语法。 ReSharper 擅长建议更改以删除源代码中的多余内容。
【解决方案3】:

我可以通过在“薄”位置插入 GC.Collect() 来解决 WPF 应用程序内存泄漏问题。

希望对您有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-21
    • 2012-04-30
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多