我分析了一個VB.NET項目,並且有一些對象(孩子MDI窗體)被處置,但未被GC刪除。事件處理程序和內存泄漏
的MemoryProfiler分析發現,除其他外,以下內容:
「這個實例配置,仍然 間接的事件處理程序紮根 這通常表明 事件處理程序一直沒有得到妥善 刪除,是的 內存泄漏的常見原因。下面的實例是 的事件處理程序(一個或多個)直接紮根。 調查他們獲得有關此問題的詳細信息 ......」
現在,我試圖弄清楚這意味着什麼以及如何解決它。
我有一個MDI表單和一個子表單。兒童表格在打開/關閉後未被GC收集,顯然是因爲MDIForm參考的仍然是(間接的)EventHandlerList
...
什麼是它,我該如何解決它?
我試着在this thread建議修復,因爲曾與在PropertyStore
,現在MDI參考該淘汰了問題,但出現了MDI EventHandlerList
參考子窗體...
後一些代碼分析我觀察到一些
AddHandler newMenu.Click, AddressOf ClickMenu
沒有在前RemoveHandler newMenu.Click, AddressOf ClickMenu
。它可能是主要原因嗎?
而且,一propos,是Handles
Private Sub ClickMenu(sender as Object, e as EventArgs) Handles newMenu.Click
更好的是
RemoveHandler newMenu.Click, AddressOf ClickMenu
AddHandler newMenu.Click, AddressOf ClickMenu
但從內存分配點?
剪去代碼可能會有所幫助。特別是添加和刪除事件處理程序並處理代碼。 – 2010-02-05 13:43:57
在處理後調用GC.Collect()有什麼區別嗎?僅僅因爲某些東西被處置並不總是意味着它被垃圾直接收集起來。 – Ian 2010-02-05 13:45:03
另外..這真的是一個問題?通過閱讀您關聯的論壇可以發現,隨着時間的推移,這種情況不會變得更糟。通過MS代碼泄漏幾kb將會產生巨大影響? – Ian 2010-02-05 13:46:57