内存泄漏问题。如何“读取”根路径?

时间:2013-02-08 11:26:18

标签: .net memory-leaks

我有一个内存分析器并跟踪一个应用程序。 在该应用程序中,当我连续多次打开表单(6)时,应用程序变得不稳定并且可能会关闭。

怀疑有记忆泄漏。因此,我跟踪以下根路径 enter image description here

如何阅读此图表以修复memorey泄漏?

2 个答案:

答案 0 :(得分:1)

我在堆栈顶部看到很多eventHandlers。

内存泄漏的常见原因是实例直接由EventHandler生根。您的“泄露”实例可能只能用作EventHandler的目标,而且没有其他方法可以实现它。他们甚至可能已被处置。

我建议使用.NET MemoryProfiler的(踪迹)。它可以捕获快照并自动指出一些常见问题,比如eventHandlers使实例保持活动状态。

答案 1 :(得分:1)

根位于顶部,您的控件/类位于底部。通常你会向任何一个方向读取,试图在路径中找到问题。如前所述,EventHandler是一个非常常见的问题。特别是在静态环境中。意思是,某些类通过+ =挂钩到一个事件上并且再也不会解开。只要两个组件,类和提供一个组件的事件都是非静态的而不是保存在其他任何地方,那就没问题了。

在您的示例中,UserPreferenceChanged事件似乎是问题,我猜这是一个静态事件。因此,UltraToolbarsManager(它似乎也是静态的)会挂钩该事件。似乎UltraToolbarsManager还处理工具栏图标的所有单击事件。所以,问题是,你的类挂起了一个ToolClick事件。

可能的解决方案

  1. 尝试处理/清理UltraToolbarsManager(如果是非静态的) UserPreferenceChanged事件取消挂钩或
  2. 在清理您自己的班级时从ToolClick事件取消挂钩。