我想我在桌面应用程序(.NET 4.0,WinForms,VB.NET)中发现了内存泄漏。不幸的是我无法解释,为什么会发生。
我有Form
个自定义 - TabControl
(继承自XtraTabControl
- DevExpress)。此TabControl
在每个TabPage
个不同的客户群中显示。如果您双击一行(客户),我会打开一个新的Form
,其中包含客户的所有详细信息。在这个新的Form
中,有一些DataGrids
(同样是使用DevExpress中的GridControl
和GridView
的自定义控件)和许多其他控件(Labels
,TextBoxes
等)。如果详细信息 - Form
已经打开,则会使用新客户数据进行更新。
以下是内存泄漏的一些事实:
EventHandlers
持有90 Kb RAM EventHandlers
持有127 Mb RAM EventHandlers
持有132 Mb RAM 我尝试System.GC.Collect(2, GCCollectionMode.Forced)
只是为了好玩(我知道我不应该这样做),但它根本没有改变任何东西。
我知道事件的发布者持有对订阅者的引用,因此如果发布者的寿命比订阅者长,那么它将使订阅者保持活跃状态。但如果我关闭所有两个Forms
,那么不应该都是好的吗?
编辑2:这是ANTS Memory Profiler的另一个屏幕截图。不幸的是我无法得到它的线索:
希望你们能帮助我,提前谢谢!
答案 0 :(得分:0)
感谢您的帮助。我想我明白了!
我安装了.NET Memory Profiler 5.0,这个应用程序向我展示了持有event
的{{1}}的callstack。然后我在我的自定义控件中实现了一些GridViews
- 方法,目前我几乎收回了所有内存。
BTW:在Dispose
- 方法中删除EventHandlers
是不是一个糟糕的设计?