OutOfMemoryException問(wèn)題的處理
Author:chainet From:Cnblogs
介紹
我所參與做的產(chǎn)品是一個(gè)比較大型的ASP.NET系統(tǒng),在測(cè)試部門和客戶那里,如果長(zhǎng)時(shí)間運(yùn)行,系統(tǒng)常常會(huì)出現(xiàn)一些OutOfMemoryException的異常。引起內(nèi)存溢出的錯(cuò)誤的原因有很多,主要在服務(wù)器配置方面和代碼編寫兩個(gè)方面可以進(jìn)行優(yōu)化和改進(jìn),避免此類問(wèn)題的出現(xiàn),但完全杜絕是比較困難的。下面是我收集整理的一些解決方法。 服務(wù)器配置方面
1. 安裝.NET Framework 1.1 Service Pack 1 補(bǔ)丁部分解決了一些內(nèi)存泄漏的問(wèn)題,下載地址為:http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=a8f5654f-088e-40b2-bbdb-a83353618b38 a.打開(kāi)/3GB Switch(如果你有3GB以上的內(nèi)存)。這個(gè)配置只在Windows 2000 Advanced Server和Data Center版本以及Windows Server 2003以上才支持,參見(jiàn): 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工作進(jìn)程,而是.NET整個(gè)使用的內(nèi)存是有一定限制的,可以通過(guò)加大配置使用量來(lá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是避免此異常的一個(gè)較好的方式。但這個(gè)功能是IIS 6.0(也就是Windows 2003上帶的IIS)才支持。 配置方法如下: 修改IIS的應(yīng)用程序池配置,選擇DefaultAppPool(如果你的系統(tǒng)是用這個(gè)池),右鍵點(diǎn)屬性->Recycling Setting,然后選擇根據(jù)情況 修改“Recycle worker processes at the following times:‘等幾項(xiàng)配置,其中定時(shí)回收工作進(jìn)程是一個(gè)比較好的方式,可以避免回收工作進(jìn)程時(shí),引起客戶Session丟失。 Windows 2000 server 上安裝的是IIS 5.0,本身不支持Recycle,但要想實(shí)現(xiàn)這個(gè)功能也不難。微軟針對(duì)IIS提供的IIS5Recycle便是這樣一個(gè)程序,它安裝后以服務(wù)形式提供回收工作進(jìn)程。 安裝說(shuō)明見(jiàn)http://support.microsoft.com/?id=322350 圖片是表示安裝好之后的配置信息! 是不是和IIS6中的一模一樣?
代碼編寫方面的注意問(wèn)題 1.System.Drawing方面的類使用問(wèn)題
System.Drawing用到了很多系統(tǒng)的資源和非托管代碼,所以使用的時(shí)候要特別小心,注意內(nèi)存泄漏(Memory Leak)例如:BitMap.MakeTransparent方法的使用問(wèn)題:
http://www./247reference/msgs/40/202528.aspx 2.new byte[]問(wèn)題
處理流的時(shí)候常常會(huì)用到new一個(gè)大的byte數(shù)組。但在多用戶情況下會(huì)消耗大量的內(nèi)存。正確的做法應(yīng)該是定義一個(gè)比較小的byte數(shù)組做為緩存,然后循環(huán)使用。如在我們的程序中,有些地方使用不當(dāng),當(dāng)圖片(或附件)過(guò)大或過(guò)多的時(shí)候, new byte[length]就有可能消耗過(guò)多的內(nèi)存。 3. 避免使用大對(duì)象數(shù)組或小對(duì)象大數(shù)組 編程時(shí)同樣要重視效率問(wèn)題(包括內(nèi)存占用問(wèn)題)。 4.Com接口調(diào)用是要注意釋放對(duì)象。 Add by : Huobazi (2005-11-17:03:20)
|
|