国产美女一级毛片精品久久久|婷婷影院在线综合免费视频|最新国产午夜精品视频成人|久久精品九九无码免费

如何處理.NET中的內(nèi)存泄露

來源:北大青鳥飛迅校區(qū)|發(fā)布時(shí)間:2013-04-27 18:46:32

    C#這樣的編程語言使用垃圾收集器來清理內(nèi)存,對于程序完全不會再訪問的內(nèi)存,本應(yīng)是沒有內(nèi)存泄漏的。Fabrice稱,內(nèi)存泄漏發(fā)生在一塊內(nèi)存不 再被使用,但卻依然被程序所引用時(shí)。當(dāng)一塊內(nèi)存無法被程序訪問到時(shí),垃圾收集器將會重新分配這塊內(nèi)存,但是如果程序仍然保持對內(nèi)存的引用卻不使用這塊內(nèi)存 時(shí),就會造成內(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、用于窗口管理的用戶對象,包括快捷鍵表、符號、光標(biāo)、鉤子、圖標(biāo)、菜單和窗口。

3、用于圖形的GDI對象:位圖、畫刷、設(shè)備環(huán)境(DC)、字體、內(nèi)存DC、元文件、調(diào)色板、畫筆、區(qū)域等。

4、用于內(nèi)存管理、進(jìn)程執(zhí)行和進(jìn)程間通信(IPC)的Kernel對象:文件、進(jìn)程、線程、信號、定時(shí)器、訪問令牌、套接字等。

    這些資源都是有限制的,注冊表中的GDIProcessHandleQuota和 USERProcessHandleQuota鍵保存了單個(gè)進(jìn)程可用的最大之一GDI對象和用戶對象數(shù)量,默認(rèn)值是10000。雖然這個(gè)數(shù)字對于大多數(shù)程序足 夠了,但如果使用的過多則可能會達(dá)到另一個(gè)限制,一個(gè)Windows session最多只能有65536個(gè)句柄。Fabrice說這個(gè)限制很容易就會達(dá)到。他的結(jié)論是,要小心使用和釋放系統(tǒng)資源

Fabrice列舉了一些內(nèi)存泄漏的根本原因,以及是如何造成泄漏的:

1、使用靜態(tài)引用

2、未退訂的事件-作者認(rèn)為這是最常見的內(nèi)存泄漏原因

3、未退訂的靜態(tài)事件

4、未調(diào)用Dispose方法

5、使用不徹底的Dispose方法

6、在Windows Forms中對BindingSource的誤用

7、未在WorkItem/CAB上調(diào)用Remove

作者在文章中還提供了一些避免內(nèi)存泄漏的建議:

1、對象的創(chuàng)建者或擁有者負(fù)責(zé)銷毀對象,而不是使用者

2、當(dāng)不再需要一個(gè)事件訂閱者時(shí)退訂此事件,為確保安全可以在Dispose方法中退訂

3、當(dāng)對象不再觸發(fā)事件時(shí),應(yīng)該將對象設(shè)為null來移除所有的事件訂閱者

4、當(dāng)模型和視圖引用同一個(gè)對象時(shí),推薦給視圖傳遞一個(gè)此對象的克隆,以防止無法追蹤誰在使用哪個(gè)對象

5、對系統(tǒng)資源的訪問應(yīng)該包裝在using塊中,這將在代碼執(zhí)行后強(qiáng)制執(zhí)行Dispose

Fabrice最后介紹了一些工具來對付泄漏:GDILeaks(EXE)、dotTrace、.NET Memory Profiler、SOS.dll和WinDbg。

上一篇:ASP.NET頁面自動(dòng)刷新方法總結(jié)
下一篇:Microsoft .NET Services是什么?

熱門話題

招生熱線: 4008-0731-86 / 0731-82186801

學(xué)校地址: 長沙市天心區(qū)團(tuán)結(jié)路6號

Copyright © 2006 | 湖南大計(jì)信息科技有限公司 版權(quán)所有

湘ICP備14017520號-3

關(guān)注我們
在線咨詢
嘿,我來幫您!