2013-01-10 18 views
0

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

我们的测试案例在于打开一个窗口,让您从列表中选择一个插件。该窗口托管一个Wizard控件,该控件包含一个标题,一组按钮和一个显示活动WizardPage(即UserControl)的主区域。通过选择插件并单击下一步按钮,更多的WizardPage控件在向导区域中注册并使用RegionAdapter添加到Wizard.Pages集合中。用户可以通过点击Next/Previous按钮来浏览页面。 如果我们打开向导窗口,只需单击取消按钮,则会按预期方式调用向导控件终结器。但是,如果我们在单击“取消”按钮之前打开向导窗口并展开插件组合框,则永远不会调用向导控件终结器。这里是Instance分类程序为向导的蚂蚁内存分析器截图:

Instance Categorizer

我们尝试没有成功,几乎一切,可能有人帮助我们理解这是怎么回事呢?

预先感谢您。

+0

而不是张贴截图的图像,如何张贴实际的消息?我根本看不懂。 – Joe

+0

@Joe:请在新标签中打开图片(查看图片,在另一个标签中打开图片或类似内容)。此时,您将可以缩放并查看实际大小的图像。 –

+0

你不能关闭你的ImportWizardWindow吗?这看起来像是你拥有的唯一真正的类。配置窗口,你应该没问题。但从截图中的数字来看,无处不在1,所以这可能不是真正的问题,蚂蚁的分析是虚假的。 –

回答

2

如果你刚开始接触ANTS Memory Profiler,你可能会发现它最有用的通过看类列表而不是实例分类开始。

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

选择WizardPage实例,然后单击以查看实例保留图,该图显示引用链回到内存中保存该特定实例的GC根。

通过回顾那些引用链,你应该能够确定哪些链接存在应该被打破,以便从内存中释放对象。