在WPF应用程序中执行某些操作(按下启动一系列计算的按钮)发生内存泄漏(在vm size部分的任务管理器中可见)大约10 MB每次按下按钮后。
计算顺序不包含错误。
使用内存分析器(.NET Memory Profiler
)表明.net中的泄漏不存在,但每次按下按钮后,名称/资源部分(标记为HeapMemory)中显示的内存大小大约增加10兆字节。
我已经阅读过关于WPF漏洞的帖子,但这些不是我的定义。
有什么不对?有什么建议?也许,有人有同样的问题?
答案 0 :(得分:3)
看到使用内存的增加是.NET中用于检测内存泄漏的误称。
很容易在WPF中造成内存泄漏。我建议使用更像视觉的工具,如Redgate Ants Memory Profiler(14天免费试用)。使用此方法测试泄漏:
当您转到“班级列表”并检查过滤器“从当前快照显示:仅新对象”时。这可以让你更好地了解你是否有永远不会放手的物品。
关于Ants Memory Profiler的另一件事是,它有链接到各地的视频,指导您如何找到泄漏。追踪泄漏是一种黑色艺术,很高兴能得到帮助。
不,我不为Redgate工作:)
答案 1 :(得分:2)
也许您需要使用WeakEvent Pattern as documented on MSDN来避免泄漏?
侦听事件可能会导致内存泄漏。侦听事件的典型技术是使用特定于语言的语法将处理程序附加到源上的事件。例如,在C#中,该语法为:
source.SomeEvent += new SomeEventHandler(MyEventHandler)
。此技术创建从事件源到事件侦听器的强引用。通常,为侦听器附加事件处理程序会导致侦听器具有受源的对象生存期影响的对象生存期(除非显式删除事件处理程序)。但在某些情况下,您可能希望侦听器的对象生存期仅由其他因素控制,例如它当前是否属于应用程序的可视树,而不是源的生命周期。 每当源对象的生命周期超出侦听器的对象生存期时,正常的事件模式会导致内存泄漏:侦听器的活动时间比预期的长。
(我的重点。)
答案 2 :(得分:0)
我可以通过插入“瘦”位GC.Collect()来解决WPF应用程序内存泄漏问题。
希望这有帮助!