OutOfMemoryException問題的處理

2010-08-28 10:49:44來源:西部e網(wǎng)作者:

介紹

我所參與做的產(chǎn)品是一個比較大型的ASP.NET系統(tǒng),在測試部門和客戶那里,如果長時間運行,系統(tǒng)常常會出現(xiàn)一些OutOfMemoryException的異常。引起內(nèi)存溢出的錯誤的原因有很多,主要在服務(wù)器配置方面和代碼編寫兩個方面可以進行優(yōu)化和改進,避免此類問題的出現(xiàn),但完全杜絕是比較困難的。下面是我收集整理的一些解決方法。 

服務(wù)器配置方面

1.安裝.NET Framework 1.1 Service Pack 1

補丁部分解決了一些內(nèi)存泄漏的問題,下載地址為:http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=a8f5654f-088e-40b2-bbdb-a83353618b38 

2.使用更多的內(nèi)存

a.打開/3GB Switch(如果你有3GB以上的內(nèi)存)。這個配置只在Windows 2000 Advanced Server和Data Center版本以及Windows Server 2003以上才支持,參見:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag/html/scalenetchapt17.asp

http://support.microsoft.com/default.aspx?scid=kb;en-us;820108

b.即使你有很多內(nèi)存,但.NET(注意不是ASP.NET工作進程,而是.NET整個使用的內(nèi)存是有一定限制的,可以通過加大配置使用量來減少內(nèi)存溢出的發(fā)生。方法如下:

修改machine.config文件,一般在 %System%\Microsoft.Net\Framework\v1.1.4322\CONFIG目錄中, 修改processModel元素中的memoryLimit,大于缺省設(shè)置的60(意味著物理內(nèi)存的60%)。

3.回收工作線程

設(shè)置IIS定期清除Work process是避免此異常的一個較好的方式。但這個功能是IIS 6.0(也就是Windows 2003上帶的IIS)才支持。

配置方法如下:

修改IIS的應(yīng)用程序池配置,選擇DefaultAppPool(如果你的系統(tǒng)是用這個池),右鍵點屬性->Recycling Setting,然后選擇根據(jù)情況 修改“Recycle worker processes at the following times:'等幾項配置,其中定時回收工作進程是一個比較好的方式,可以避免回收工作進程時,引起客戶Session丟失。

Windows 2000 server 上安裝的是IIS 5.0,本身不支持Recycle,但要想實現(xiàn)這個功能也不難。微軟針對IIS提供的IIS5Recycle便是這樣一個程序,它安裝后以服務(wù)形式提供回收工作進程。

安裝說明見http://support.microsoft.com/?id=322350

圖片是表示安裝好之后的配置信息! 是不是和IIS6中的一模一樣?

 

代碼編寫方面的注意問題 

1.System.Drawing方面的類使用問題

System.Drawing用到了很多系統(tǒng)的資源和非托管代碼,所以使用的時候要特別小心,注意內(nèi)存泄漏(Memory Leak)例如:BitMap.MakeTransparent方法的使用問題:

http://www.dotnet247.com/247reference/msgs/40/202528.aspx

2.new byte[]問題

處理流的時候常常會用到new一個大的byte數(shù)組。但在多用戶情況下會消耗大量的內(nèi)存。正確的做法應(yīng)該是定義一個比較小的byte數(shù)組做為緩存,然后循環(huán)使用。如在我們的程序中,有些地方使用不當(dāng),當(dāng)圖片(或附件)過大或過多的時候, new byte[length]就有可能消耗過多的內(nèi)存。

3.  避免使用大對象數(shù)組或小對象大數(shù)組

編程時同樣要重視效率問題(包括內(nèi)存占用問題)。

4.Com接口調(diào)用是要注意釋放對象。

關(guān)鍵詞:ASP.NET

贊助商鏈接: