0

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

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

实例分类器

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

先感谢您。

4

1 回答 1

2

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

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

选择 WizardPage 的实例并单击以查看实例保留图,该图显示了指向在内存中持有该特定实例的 GC 根的引用链。

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

于 2013-01-16T17:53:17.460 回答