一,運行時錯誤
首先程序的異常,甚至錯誤是在所難免的,但當系統出現異常時,應該提供給用戶一個友好的界面,并簡單說明原因,對這個問題,我一般的解決辦法是
<customErrors mode="Off" /> 這里可以不用配置
然后在HttpModule的Application_Error事件中檢測所有Error,并跳轉到指定友好頁面。另外也可以在所有頁面的基類的Page_Error事件中檢測,并跳轉到指定友好頁面,ASP.NET forums提供的解決方案,我覺得已經很優秀了,博客堂的寶玉提供這方面的很好的介紹
二,OutOfMemoryException異常如何處理
在什么情況下會出現OutOfMemonryException呢?
引<<.net框架程序設計修訂版>>的話: 在我們試圖新建一個對象時,而垃圾收集器又找不到任何可用內存時被拋出,這種情況下我們是可以捕獲該異常的,另一種情況是,CLR需要內存時,而卻系統卻不能提供,也會拋出該異常,但此時,我們的應用程序是不能捕獲該錯誤的
<<.net框架程序設計修訂版>>把OutOfMemoryException異常列為開發人員幾乎從來不會考慮的隱含假設,也就是說,很多開發人員根本不考慮該異常發生的可能并做出處理,起碼我在我開發的系統里并沒有專門考慮這個異常
我現在考慮的問題是:
1,如果是新建對象找不到可用內存拋出該異常,那么在HttpModule的Application_Error事件能否捕獲改錯誤?我的想法是,即使可以捕獲,也是不能得到處理的,因為自定義的異常處理仍然需要內存來運行,所以無論能否捕獲,都不能做友好處理
2,如果CLR找不到需要的內存情況下拋出改異常,那就更不能處理了
也就是說,幾乎在任何情況下,我們都無法在系統出現OutOfMemoryException異常提供友好界面?
服務器配置方面
1. 安裝.NET Framework 1.1 Service Pack 1補丁部分解決了一些內存泄漏的問題,下載地址為:http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=a8f5654f-088e-40b2-bbdb-a83353618b38
2.使用更多的內存
a.打開/3GB Switch(如果你有3GB以上的內存)。這個配置只在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.即使你有很多內存,但.NET(注意不是ASP.NET工作進程,而是.NET整個使用的內存是有一定限制的,可以通過加大配置使用量來減少內存溢出的發生。方法如下:修改machine.config文件,一般在%System%/Microsoft.Net/Framework/v1.1.4322/CONFIG目錄中, 修改processModel元素中的memoryLimit,大于缺省設置的60(意味著物理內存的60%)。
3.回收工作線程
設置IIS定期清除Work process是避免此異常的一個較好的方式。但這個功能是IIS 6.0(也就是Windows 2003上帶的IIS)才支持。配置方法如下:修改IIS的應用程序池配置,選擇DefaultAppPool(如果你的系統是用這個池),右鍵點屬性->Recycling Setting,然后選擇根據情況 修改“Recycle worker processes at the following times:'等幾項配置,其中定時回收工作進程是一個比較好的方式,可以避免回收工作進程時,引起客戶Session丟失。
Windows 2000 server 上安裝的是IIS 5.0,本身不支持Recycle,但要想實現這個功能也不難。微軟針對IIS提供的IIS5Recycle便是這樣一個程序,它安裝后以服務形式提供回收工作進程。
安裝說明見http://support.microsoft.com/?id=322350
代碼編寫方面的注意問題
1.System.Drawing方面的類使用問題
System.Drawing用到了很多系統的資源和非托管代碼,所以使用的時候要特別小心,注意內存泄漏(Memory Leak)例如:BitMap.MakeTransparent方法的使用問題:http://www.dotnet247.com/247reference/msgs/40/202528.aspx
2.new byte[]問題
處理流的時候常常會用到new一個大的byte數組。但在多用戶情況下會消耗大量的內存。正確的做法應該是定義一個比較小的byte數組做為緩存,然后循環使用。如在我們的程序中,有些地方使用不當,當圖片(或附件)過大或過多的時候, new byte[length]就有可能消耗過多的內存。
3. 避免使用大對象數組或小對象大數組
編程時同樣要重視效率問題(包括內存占用問題)。
4.Com接口調用是要注意釋放對象。
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= 標識來檢索詞描述;查看幫助和支持以了解詳細信息。下列信息是事件的一部分: System.OutOfMemoryException: 發生類型為 System.OutOfMemoryException 的異常。
http://blog.joycode.com/kaneboy/archive/2005/05/07/50409.aspx
在博客園看到了一位園友寫的文章《如何處理OutOfMemoryException異常?》,于是想和大家交流一下ASP.NET中出現OutOfMemoryException的問題。
實際上,在ASP.NET Web服務器上,ASP.NET所能夠用到的內存,通常不會等同于所有的內存數量。在machine.config配置文件中,配置節<processModel>中有一個屬性“memoryLimit”,這個屬性的值是一個百分值,默認為“60”,即指定了ASP.NET進程(在任務管理器中大家就可以看到ASP.NET的進程,IIS5中為aspnet_wp,IIS6中為w3wp)能夠使用所有物理內存的60%。當ASP.NET使用的內存量超過這個限額時,IIS會開始自動回收(recycle)進程,即創建一個新的進程去負責應付Http請求,而將舊進程所占用的內存回收。
當我們有一臺很大內存的服務器時,“memoryLimit”這個值是需要進行適當的調整的。比如我們準備了一臺4G內存的服務器,那么4G×60%=2.4G。但是,對于Win32操作系統,一個進程所能占用的所有內存空間只有2G。當ASP.NET進程占用的內存開始達到2G時,由于它并沒有達到2.4G的“回收閾值”,所以IIS不會啟動recycle進程操作,但是由于Win32的限制,實際上已經不能給這個進程分配更多的內存了,于是,OutOfMemoryException就很可能會被拋出了。為了避免這樣的情況,我們就必須將“memoryLimit”適當調小,以讓IIS更早的進行進程回收。
微軟推薦的ASP.NET進程占用內存是不超過60%,并最好使計算出的實際值不超過800M。就是說,對于一臺4G內存的服務器,最好將“memoryLimit”屬性設置成“20”。設置一個適當的回收閾值,讓IIS適時的進行進程回收,對于保證整個服務器的穩定運行,避免OutOfMemoryException是非常重要的。
在IIS6中,ASP.NET進程的回收閾值不再由配置節中的“memoryLimit”屬性決定,而是由IIS管理器中的應用程序池配置中的設置決定。
但是,即使正確設置了這些配置,也不能保證完全避免OutOfMemoryException的發生,原因可能是多樣而復雜的,比如內存回收操作可能耗時太多等等。開發人員要注意的,就是在代碼中時刻牢記不要無謂的使用和浪費內存。:)
如果你有一臺大內存的服務器,同時對Win32操作系統中對于進程最高使用2G內存的限制很郁悶,可選的解決方法有兩個:
1、使用/3GB模式啟動計算機,方法參加文后的鏈接
2、使用Windows Server 2003 64bits Edition