0

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

怀疑是内存泄漏。所以,我跟踪以下根路径 在此处输入图像描述

如何阅读此图以修复内存泄漏?

4

2 回答 2

1

我在堆栈顶部看到很多事件处理程序。

内存泄漏的一个常见原因是实例直接由 EventHandler 根植。您的“泄漏”实例可能仅用作 EventHandler 的目标,并且没有其他方法可以到达它。它们甚至可能已经被处理掉了。

我建议使用.NET MemoryProfiler的(线索) 。它可以捕获快照并自动指出一些常见问题,例如事件处理程序使实例保持活动状态。

于 2013-02-08T11:30:16.117 回答
1

根在顶部,您的控件/类在底部。通常,您会朝任一方向阅读,试图找出路径中的问题。如前所述,EventHandlers 是一个非常常见的问题。尤其是在静态环境中。意思是,某些类通过 += 挂钩到一个事件上,并且永远不会再次取消挂钩。只要两个组件,类和提供一个的事件,都是非静态的并且没有保存在其他任何地方,这没有问题。

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

可能的解决方案是

  1. 尝试处理/清理 UltraToolbarsManager(如果是非静态的),以便取消 UserPreferenceChanged 事件或
  2. 清理自己的类时从 ToolClick 事件中解脱。
于 2013-02-08T12:03:59.753 回答