我有一个内存分析器并跟踪一个应用程序。 在该应用程序中,当我连续多次打开表单(6)时,应用程序变得不稳定并且可能会关闭。
怀疑有记忆泄漏。因此,我跟踪以下根路径
如何阅读此图表以修复memorey泄漏?
答案 0 :(得分:1)
我在堆栈顶部看到很多eventHandlers。
内存泄漏的常见原因是实例直接由EventHandler生根。您的“泄露”实例可能只能用作EventHandler的目标,而且没有其他方法可以实现它。他们甚至可能已被处置。
我建议使用.NET MemoryProfiler的(踪迹)。它可以捕获快照并自动指出一些常见问题,比如eventHandlers使实例保持活动状态。
答案 1 :(得分:1)
根位于顶部,您的控件/类位于底部。通常你会向任何一个方向读取,试图在路径中找到问题。如前所述,EventHandler是一个非常常见的问题。特别是在静态环境中。意思是,某些类通过+ =挂钩到一个事件上并且再也不会解开。只要两个组件,类和提供一个组件的事件都是非静态的而不是保存在其他任何地方,那就没问题了。
在您的示例中,UserPreferenceChanged事件似乎是问题,我猜这是一个静态事件。因此,UltraToolbarsManager(它似乎也是静态的)会挂钩该事件。似乎UltraToolbarsManager还处理工具栏图标的所有单击事件。所以,问题是,你的类挂起了一个ToolClick事件。
可能的解决方案