JDP 發表於 2006-9-28 15:08:43

IIS ASP.NET OutOfMemoryException 問題的處理

引自: Chainet的技術生涯
http://www.cnblogs.com/chainet/archive/2005/01/25/97000.html

介紹
我所參與做的產品是一個比較大型的ASP.NET系統,在測試部門和客戶那裡,如果長時間運行,系統常常會出現一些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
圖片是表示安裝好之後的配置信息! 是不是和IIS6中的一模一樣?http://www.cnblogs.com/Emoticons/emwink.gif

http://www.cnblogs.com/images/cnblogs_com/chainet/IIS5Recycle.JPG


代碼編寫方面的注意問題

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就有可能消耗過多的內存。


3.避免使用大對像數組或小對像大數組
編程時同樣要重視效率問題(包括內存佔用問題)

4.Com接口調用是要注意釋放對象
頁: [1]
查看完整版本: IIS ASP.NET OutOfMemoryException 問題的處理