常見的內(nèi)存泄露演示
作者使用了一個Forma,每一個按鈕都會打開一個子form。按常理,當子form被關(guān)閉時,我們都希望它所占有的資源被自動釋放。但在這里,作者將在每一個子form中演示一種泄露的情況。
Static references
最明顯的,如果一個對象被靜態(tài)字段(field)引用,它永遠都不會被釋放。這種情況常見于單鍵模式,因為它們往往都市靜態(tài)的,要不就是長時間駐留的。
這些直接引用往往都是顯而易見的,但真正危險的都是那些間接引用。因此你需要格外注意引用串。一個有效的方法就是查看這個串的根,如果這個根式靜態(tài)的,那整個串上的引用都無法被釋放。
如上圖,如果Object1是靜態(tài)的或者長駐留的,那么這條引用串上的對象都不被釋放。危險的是,串很長時就很難意識到它的根是靜態(tài)類型的。比如,如果僅僅注意了一級深度,那么當Object2消失的時候,Object3和Object4就應該被釋放,當你很可能忽視了Object1的存在。
建議是慎用靜態(tài)類型,盡可能的不用,否則請格外注意其或其他單鍵對象的內(nèi)存駐留時間。
一種具體的風險就是靜態(tài)事件,將在事件泄露演示中闡述。
事件或"lapsed listener"
子form訂閱了main form的事件,以便在main form的通透度(opacity)變化時得到通知。
問題由此產(chǎn)生:OpacityChanged事件創(chuàng)建了一個由main form到子form的引用:
作者在另外一篇文章中討論了 事件和引用的關(guān)系 ,這里只給出了演示圖,和jetTrace截圖:
作者使用了一個Forma,每一個按鈕都會打開一個子form。按常理,當子form被關(guān)閉時,我們都希望它所占有的資源被自動釋放。但在這里,作者將在每一個子form中演示一種泄露的情況。

Static references
最明顯的,如果一個對象被靜態(tài)字段(field)引用,它永遠都不會被釋放。這種情況常見于單鍵模式,因為它們往往都市靜態(tài)的,要不就是長時間駐留的。
這些直接引用往往都是顯而易見的,但真正危險的都是那些間接引用。因此你需要格外注意引用串。一個有效的方法就是查看這個串的根,如果這個根式靜態(tài)的,那整個串上的引用都無法被釋放。

如上圖,如果Object1是靜態(tài)的或者長駐留的,那么這條引用串上的對象都不被釋放。危險的是,串很長時就很難意識到它的根是靜態(tài)類型的。比如,如果僅僅注意了一級深度,那么當Object2消失的時候,Object3和Object4就應該被釋放,當你很可能忽視了Object1的存在。
建議是慎用靜態(tài)類型,盡可能的不用,否則請格外注意其或其他單鍵對象的內(nèi)存駐留時間。
一種具體的風險就是靜態(tài)事件,將在事件泄露演示中闡述。
事件或"lapsed listener"
子form訂閱了main form的事件,以便在main form的通透度(opacity)變化時得到通知。
mainForm.OpacityChanged += mainForm_OpacityChanged;
問題由此產(chǎn)生:OpacityChanged事件創(chuàng)建了一個由main form到子form的引用:

作者在另外一篇文章中討論了 事件和引用的關(guān)系 ,這里只給出了演示圖,和jetTrace截圖:


How to detect and avoid memory and resources leaks in .NET applications 摘譯2
更多文章、技術(shù)交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
