内存泄漏 - 可能是许多事件处理程序的原因

时间:2015-08-10 08:29:57

标签: .net vb.net winforms memory-leaks

我想我在桌面应用程序(.NET 4.0,WinForms,VB.NET)中发现了内存泄漏。不幸的是我无法解释,为什么会发生。

我有Form个自定义 - TabControl(继承自XtraTabControl - DevExpress)。此TabControl在每个TabPage个不同的客户群中显示。如果您双击一行(客户),我会打开一个新的Form,其中包含客户的所有详细信息。在这个新的Form中,有一些DataGrids(同样是使用DevExpress中的GridControlGridView的自定义控件)和许多其他控件(LabelsTextBoxes等)。如果详细信息 - Form已经打开,则会使用新客户数据进行更新。

以下是内存泄漏的一些事实:

  • 启动应用程序后:使用77 Mb RAM; 2.640 EventHandlers持有90 Kb RAM
  • 开设25位客户后:使用190 Mb; 75.016 EventHandlers持有127 Mb RAM
  • 关闭两种形式后:仍然使用190 Mb,66.216 EventHandlers持有132 Mb RAM

我尝试System.GC.Collect(2, GCCollectionMode.Forced)只是为了好玩(我知道我不应该这样做),但它根本没有改变任何东西。

我知道事件的发布者持有对订阅者的引用,因此如果发布者的寿命比订阅者长,那么它将使订阅者保持活跃状态​​。但如果我关闭所有两个Forms,那么不应该都是好的吗?

编辑:这是打开25个客户并关闭2个表单后的内存屏幕截图。看起来,内存中仍有很多控件:( enter image description here (已翻译的列:对象类型|计数|大小|保持内存大小)

编辑2:这是ANTS Memory Profiler的另一个屏幕截图。不幸的是我无法得到它的线索: enter image description here

希望你们能帮助我,提前谢谢!

1 个答案:

答案 0 :(得分:0)

感谢您的帮助。我想我明白了!

我安装了.NET Memory Profiler 5.0,这个应用程序向我展示了持有event的{​​{1}}的callstack。然后我在我的自定义控件中实现了一些GridViews - 方法,目前我几乎收回了所有内存。

BTW:在Dispose - 方法中删除EventHandlers是不是一个糟糕的设计?