常見(jiàn)的內(nèi)存泄露演示
作者使用了一個(gè)Forma,每一個(gè)按鈕都會(huì)打開(kāi)一個(gè)子form。按常理,當(dāng)子form被關(guān)閉時(shí),我們都希望它所占有的資源被自動(dòng)釋放。但在這里,作者將在每一個(gè)子form中演示一種泄露的情況。
Static references
最明顯的,如果一個(gè)對(duì)象被靜態(tài)字段(field)引用,它永遠(yuǎn)都不會(huì)被釋放。這種情況常見(jiàn)于單鍵模式,因?yàn)樗鼈兺际徐o態(tài)的,要不就是長(zhǎng)時(shí)間駐留的。
這些直接引用往往都是顯而易見(jiàn)的,但真正危險(xiǎn)的都是那些間接引用。因此你需要格外注意引用串。一個(gè)有效的方法就是查看這個(gè)串的根,如果這個(gè)根式靜態(tài)的,那整個(gè)串上的引用都無(wú)法被釋放。
如上圖,如果Object1是靜態(tài)的或者長(zhǎng)駐留的,那么這條引用串上的對(duì)象都不被釋放。危險(xiǎn)的是,串很長(zhǎng)時(shí)就很難意識(shí)到它的根是靜態(tài)類型的。比如,如果僅僅注意了一級(jí)深度,那么當(dāng)Object2消失的時(shí)候,Object3和Object4就應(yīng)該被釋放,當(dāng)你很可能忽視了Object1的存在。
建議是慎用靜態(tài)類型,盡可能的不用,否則請(qǐng)格外注意其或其他單鍵對(duì)象的內(nèi)存駐留時(shí)間。
一種具體的風(fēng)險(xiǎn)就是靜態(tài)事件,將在事件泄露演示中闡述。
事件或"lapsed listener"
子form訂閱了main form的事件,以便在main form的通透度(opacity)變化時(shí)得到通知。
問(wèn)題由此產(chǎn)生:OpacityChanged事件創(chuàng)建了一個(gè)由main form到子form的引用:
作者在另外一篇文章中討論了 事件和引用的關(guān)系 ,這里只給出了演示圖,和jetTrace截圖:
作者使用了一個(gè)Forma,每一個(gè)按鈕都會(huì)打開(kāi)一個(gè)子form。按常理,當(dāng)子form被關(guān)閉時(shí),我們都希望它所占有的資源被自動(dòng)釋放。但在這里,作者將在每一個(gè)子form中演示一種泄露的情況。
Static references
最明顯的,如果一個(gè)對(duì)象被靜態(tài)字段(field)引用,它永遠(yuǎn)都不會(huì)被釋放。這種情況常見(jiàn)于單鍵模式,因?yàn)樗鼈兺际徐o態(tài)的,要不就是長(zhǎng)時(shí)間駐留的。
這些直接引用往往都是顯而易見(jiàn)的,但真正危險(xiǎn)的都是那些間接引用。因此你需要格外注意引用串。一個(gè)有效的方法就是查看這個(gè)串的根,如果這個(gè)根式靜態(tài)的,那整個(gè)串上的引用都無(wú)法被釋放。
如上圖,如果Object1是靜態(tài)的或者長(zhǎng)駐留的,那么這條引用串上的對(duì)象都不被釋放。危險(xiǎn)的是,串很長(zhǎng)時(shí)就很難意識(shí)到它的根是靜態(tài)類型的。比如,如果僅僅注意了一級(jí)深度,那么當(dāng)Object2消失的時(shí)候,Object3和Object4就應(yīng)該被釋放,當(dāng)你很可能忽視了Object1的存在。
建議是慎用靜態(tài)類型,盡可能的不用,否則請(qǐng)格外注意其或其他單鍵對(duì)象的內(nèi)存駐留時(shí)間。
一種具體的風(fēng)險(xiǎn)就是靜態(tài)事件,將在事件泄露演示中闡述。
事件或"lapsed listener"
子form訂閱了main form的事件,以便在main form的通透度(opacity)變化時(shí)得到通知。
mainForm.OpacityChanged += mainForm_OpacityChanged;
問(wèn)題由此產(chǎn)生:OpacityChanged事件創(chuàng)建了一個(gè)由main form到子form的引用:
作者在另外一篇文章中討論了 事件和引用的關(guān)系 ,這里只給出了演示圖,和jetTrace截圖:
How to detect and avoid memory and resources leaks in .NET applications 摘譯2
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

