【问题标题】:Unable to resolve memory leaks with ANTS RedGate Memory Profiler无法使用 ANTS RedGate Memory Profiler 解决内存泄漏
【发布时间】:2012-12-24 19:30:39
【问题描述】:

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

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

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

提前谢谢你。

【问题讨论】:

  • 与其发布屏幕截图的图像,不如发布实际消息?我根本看不懂。
  • @Joe:请在新选项卡中打开图像(查看图像,在另一个选项卡中打开图像,或类似的东西)。此时,您将能够缩放并查看真实大小的图像。
  • 不能关闭 ImportWizardWindow 吗?这看起来像是您拥有的唯一真实类。处理窗口,你应该没问题。但是从屏幕截图中的数字来看,到处都是 1,所以这可能不是真正的问题,对 Ants 的分析是虚假的。

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


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多