无法使用ANTS RedGate Memory Profiler解决内存泄漏问题

时间:2013-01-10 11:59:50

标签: c# memory-leaks prism red-gate-ants

我们正在使用Prism 4开发WPF应用程序,并且由于资源未被释放而正在经历严重的内存泄漏。我们正在使用ANTS Memory Profiler来检测哪些类阻止了垃圾收集器释放内存,但我们对这个工具并不熟悉,因此我们对其输出的理解是有限的。

我们的测试用例包括打开一个窗口,让您从列表中选择一个插件。该窗口包含一个向导控件,该控件包含一个标题,一组按钮和一个显示活动WizardPage(即UserControl)的主区域。通过选择插件并单击“下一步”按钮,可以在向导区域中注册更多的WizardPage控件,并使用RegionAdapter将其添加到Wizard.Pages集合中。然后,用户可以通过单击“下一个/上一个”按钮来浏览页面。 如果我们打开向导窗口并单击“取消”按钮,则会按预期调用向导控件终结器。但是,如果我们打开向导窗口并在单击“取消”按钮之前展开插件ComboBox,则永远不会调用向导控件终结器。以下是ANTS内存分析器中向导的实例分类程序的屏幕截图:

Instance Categorizer

我们尝试了几乎所有事情都没有成功,有人可以帮助我们了解这里发生了什么吗?

提前谢谢。

1 个答案:

答案 0 :(得分:2)

如果您刚开始使用ANTS Memory Profiler,您可能会发现从查看类列表而不是实例分类程序开始最有用

一种好的方法可能是在点击应用程序中的“下一步”按钮之前先拍摄基线快照。然后打开向导窗口并展开插件组合框,然后单击取消。此时,在ANTS中拍摄另一个内存快照,并比较两者。如果你进入类列表,你可能会看到一个WizardPage类的实例现在存在于内存中,该实例以前不存在,应该被删除。选择该项,然后在ANTS中转到实例列表

选择WizardPage的实例,然后单击以查看实例保留图,它显示返回GC根的引用链,这些引用链将特定实例保存在内存中。

通过查看这些引用链,您应该能够识别哪个链接应该被破坏以便从内存中释放该对象。