來(lái)源:北大青鳥飛迅校區(qū)|發(fā)布時(shí)間:2013-04-27 18:46:32
C#這樣的編程語(yǔ)言使用垃圾收集器來(lái)清理內(nèi)存,對(duì)于程序完全不會(huì)再訪問(wèn)的內(nèi)存,本應(yīng)是沒(méi)有內(nèi)存泄漏的。Fabrice稱,內(nèi)存泄漏發(fā)生在一塊內(nèi)存不 再被使用,但卻依然被程序所引用時(shí)。當(dāng)一塊內(nèi)存無(wú)法被程序訪問(wèn)到時(shí),垃圾收集器將會(huì)重新分配這塊內(nèi)存,但是如果程序仍然保持對(duì)內(nèi)存的引用卻不使用這塊內(nèi)存 時(shí),就會(huì)造成內(nèi)存泄漏。
Fabrice還列舉了一些可能泄漏的系統(tǒng)資源:
1、The system uses User objects to support window management. They include: Accelerator tables, Carets, Cursors, Hooks, Icons, Menus and Windows.
2、用于窗口管理的用戶對(duì)象,包括快捷鍵表、符號(hào)、光標(biāo)、鉤子、圖標(biāo)、菜單和窗口。
3、用于圖形的GDI對(duì)象:位圖、畫刷、設(shè)備環(huán)境(DC)、字體、內(nèi)存DC、元文件、調(diào)色板、畫筆、區(qū)域等。
4、用于內(nèi)存管理、進(jìn)程執(zhí)行和進(jìn)程間通信(IPC)的Kernel對(duì)象:文件、進(jìn)程、線程、信號(hào)、定時(shí)器、訪問(wèn)令牌、套接字等。
這些資源都是有限制的,注冊(cè)表中的GDIProcessHandleQuota和 USERProcessHandleQuota鍵保存了單個(gè)進(jìn)程可用的最大之一GDI對(duì)象和用戶對(duì)象數(shù)量,默認(rèn)值是10000。雖然這個(gè)數(shù)字對(duì)于大多數(shù)程序足 夠了,但如果使用的過(guò)多則可能會(huì)達(dá)到另一個(gè)限制,一個(gè)Windows session最多只能有65536個(gè)句柄。Fabrice說(shuō)這個(gè)限制很容易就會(huì)達(dá)到。他的結(jié)論是,要小心使用和釋放系統(tǒng)資源
Fabrice列舉了一些內(nèi)存泄漏的根本原因,以及是如何造成泄漏的:
1、使用靜態(tài)引用
2、未退訂的事件-作者認(rèn)為這是最常見(jiàn)的內(nèi)存泄漏原因
3、未退訂的靜態(tài)事件
4、未調(diào)用Dispose方法
5、使用不徹底的Dispose方法
6、在Windows Forms中對(duì)BindingSource的誤用
7、未在WorkItem/CAB上調(diào)用Remove
作者在文章中還提供了一些避免內(nèi)存泄漏的建議:
1、對(duì)象的創(chuàng)建者或擁有者負(fù)責(zé)銷毀對(duì)象,而不是使用者
2、當(dāng)不再需要一個(gè)事件訂閱者時(shí)退訂此事件,為確保安全可以在Dispose方法中退訂
3、當(dāng)對(duì)象不再觸發(fā)事件時(shí),應(yīng)該將對(duì)象設(shè)為null來(lái)移除所有的事件訂閱者
4、當(dāng)模型和視圖引用同一個(gè)對(duì)象時(shí),推薦給視圖傳遞一個(gè)此對(duì)象的克隆,以防止無(wú)法追蹤誰(shuí)在使用哪個(gè)對(duì)象
5、對(duì)系統(tǒng)資源的訪問(wèn)應(yīng)該包裝在using塊中,這將在代碼執(zhí)行后強(qiáng)制執(zhí)行Dispose
Fabrice最后介紹了一些工具來(lái)對(duì)付泄漏:GDILeaks(EXE)、dotTrace、.NET Memory Profiler、SOS.dll和WinDbg。
全程面授,不高薪都難
申請(qǐng)成功后,我們將在24小時(shí)內(nèi)與您聯(lián)系
招生熱線: 4008-0731-86 / 0731-82186801
學(xué)校地址: 長(zhǎng)沙市天心區(qū)團(tuán)結(jié)路6號(hào)
Copyright © 2006 | 湖南大計(jì)信息科技有限公司 版權(quán)所有
湘ICP備14017520號(hào)-3