轉(zhuǎn) ASP.NET中的OutOfMemoryException
一,運行時錯誤
首先程序的異常,甚至錯誤是在所難免的,但當(dāng)系統(tǒng)出現(xiàn)異常時,應(yīng)該提供給用戶一個友好的界面,并簡單說明原因,對這個問題,我一般的解決辦法是
<customErrors mode="Off" /> 這里可以不用配置
然后在HttpModule的Application_Error事件中檢測所有Error,并跳轉(zhuǎn)到指定友好頁面。另外也可以在所有頁面的基類的Page_Error事件中檢測,并跳轉(zhuǎn)到指定友好頁面,ASP.NET forums提供的解決方案,我覺得已經(jīng)很優(yōu)秀了,博客堂的寶玉提供這方面的很好的介紹
二,OutOfMemoryException異常如何處理
在什么情況下會出現(xiàn)OutOfMemonryException呢?
引<<.net框架程序設(shè)計修訂版>>的話: 在我們試圖新建一個對象時,而垃圾收集器又找不到任何可用內(nèi)存時被拋出,這種情況下我們是可以捕獲該異常的,另一種情況是,CLR需要內(nèi)存時,而卻系統(tǒng)卻不能提供,也會拋出該異常,但此時,我們的應(yīng)用程序是不能捕獲該錯誤的
<<.net框架程序設(shè)計修訂版>>把OutOfMemoryException異常列為開發(fā)人員幾乎從來不會考慮的隱含假設(shè),也就是說,很多開發(fā)人員根本不考慮該異常發(fā)生的可能并做出處理,起碼我在我開發(fā)的系統(tǒng)里并沒有專門考慮這個異常
我現(xiàn)在考慮的問題是:
1,如果是新建對象找不到可用內(nèi)存拋出該異常,那么在HttpModule的Application_Error事件能否捕獲改錯誤?我的想法是,即使可以捕獲,也是不能得到處理的,因為自定義的異常處理仍然需要內(nèi)存來運行,所以無論能否捕獲,都不能做友好處理
2,如果CLR找不到需要的內(nèi)存情況下拋出改異常,那就更不能處理了
也就是說,幾乎在任何情況下,我們都無法在系統(tǒng)出現(xiàn)OutOfMemoryException異常提供友好界面?
服務(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
代碼編寫方面的注意問題
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)用是要注意釋放對象。
posted on 2005-01-25 13:37 Chainet
事件類型:錯誤
事件來源:Application
事件種類:無
事件 ID:0
日期:2005-11-19
事件:15:40:49
用戶:N/A
計算機:WEBHOST1
描述:事件 ID ( 0 )的描述(在資源( Application )中)無法找到。本地計算機可能沒有必要的注冊信息或消息 DLL 文件來從遠程計算機顯示消息。您可能可以使用 /AUXSOURCE= 標(biāo)識來檢索詞描述;查看幫助和支持以了解詳細信息。下列信息是事件的一部分: System.OutOfMemoryException: 發(fā)生類型為 System.OutOfMemoryException 的異常。
http://blog.joycode.com/kaneboy/archive/2005/05/07/50409.aspx
在博客園看到了一位園友寫的文章《如何處理OutOfMemoryException異常?》,于是想和大家交流一下ASP.NET中出現(xiàn)OutOfMemoryException的問題。
實際上,在ASP.NET Web服務(wù)器上,ASP.NET所能夠用到的內(nèi)存,通常不會等同于所有的內(nèi)存數(shù)量。在machine.config配置文件中,配置節(jié)<processModel>中有一個屬性“memoryLimit”,這個屬性的值是一個百分值,默認為“60”,即指定了ASP.NET進程(在任務(wù)管理器中大家就可以看到ASP.NET的進程,IIS5中為aspnet_wp,IIS6中為w3wp)能夠使用所有物理內(nèi)存的60%。當(dāng)ASP.NET使用的內(nèi)存量超過這個限額時,IIS會開始自動回收(recycle)進程,即創(chuàng)建一個新的進程去負責(zé)應(yīng)付Http請求,而將舊進程所占用的內(nèi)存回收。
當(dāng)我們有一臺很大內(nèi)存的服務(wù)器時,“memoryLimit”這個值是需要進行適當(dāng)?shù)恼{(diào)整的。比如我們準(zhǔn)備了一臺4G內(nèi)存的服務(wù)器,那么4G×60%=2.4G。但是,對于Win32操作系統(tǒng),一個進程所能占用的所有內(nèi)存空間只有2G。當(dāng)ASP.NET進程占用的內(nèi)存開始達到2G時,由于它并沒有達到2.4G的“回收閾值”,所以IIS不會啟動recycle進程操作,但是由于Win32的限制,實際上已經(jīng)不能給這個進程分配更多的內(nèi)存了,于是,OutOfMemoryException就很可能會被拋出了。為了避免這樣的情況,我們就必須將“memoryLimit”適當(dāng)調(diào)小,以讓IIS更早的進行進程回收。
微軟推薦的ASP.NET進程占用內(nèi)存是不超過60%,并最好使計算出的實際值不超過800M。就是說,對于一臺4G內(nèi)存的服務(wù)器,最好將“memoryLimit”屬性設(shè)置成“20”。設(shè)置一個適當(dāng)?shù)幕厥臻撝担孖IS適時的進行進程回收,對于保證整個服務(wù)器的穩(wěn)定運行,避免OutOfMemoryException是非常重要的。
在IIS6中,ASP.NET進程的回收閾值不再由配置節(jié)中的“memoryLimit”屬性決定,而是由IIS管理器中的應(yīng)用程序池配置中的設(shè)置決定。
但是,即使正確設(shè)置了這些配置,也不能保證完全避免OutOfMemoryException的發(fā)生,原因可能是多樣而復(fù)雜的,比如內(nèi)存回收操作可能耗時太多等等。開發(fā)人員要注意的,就是在代碼中時刻牢記不要無謂的使用和浪費內(nèi)存。:)
如果你有一臺大內(nèi)存的服務(wù)器,同時對Win32操作系統(tǒng)中對于進程最高使用2G內(nèi)存的限制很郁悶,可選的解決方法有兩個:
1、使用/3GB模式啟動計算機,方法參加文后的鏈接
2、使用Windows Server 2003 64bits Edition