在什麼情況下會出現OutOfMemonryException呢? 引<<.net架構程式設計修訂版>>的話: 在我們試圖建立一個對象時,而垃圾收集器又找不到任何可用記憶體時被拋出,這種情況下我們是可以捕獲該異常的; 另一種情況是,CLR需要記憶體時,而卻系統卻不能提供,也會拋出該異常. 但此時,我們的應用程式是不能捕獲該錯誤的.
<<.net架構程式設計修訂版>>把OutOfMemoryException異常列為開發人員幾乎從來不會考慮的隱含假設,也就是說,很多開發人員根本不考慮該異常發生的可能並做出處理,起碼我在我開發的系統裡並沒有專門考慮這個異常.
實際上,在ASP.NET Web伺服器上,ASP.NET所能夠用到的記憶體,通常不會等同於所有的記憶體數量。在machine.config (Windows XP, C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG\machine.config ; Windows 2003, C:\WINNT\Microsoft.NET\Framework\v2.0.50727\CONFIG\machine.config ) 設定檔中, 配置節<processModel>中有一個屬性“memoryLimit” (詳見:processModel Element in Machine.config),這個屬性的值是一個百分值,預設為“60”,即指定了ASP.NET進程(在工作管理員中大家就可以看到ASP.NET的進程,IIS5中為aspnet_wp,IIS6中為w3wp)能夠使用所有實體記憶體的60%。當ASP.NET使用的記憶體量超過這個限額時,IIS會開始自動回收(recycle)進程(有的資料描述為:重新啟動IIS),即建立一個新的進程去負責應付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管理器中的應用程式集區配置中的設定決定(IIS:w3wp.exe進程佔用cpu和記憶體過多的處理辦法)。
但是,即使正確設定了這些配置,也不能保證完全避免OutOfMemoryException的發生,原因可能是多樣而複雜的,比如記憶體回收操作可能耗時太多等等。開發人員要注意的,就是在代碼中時刻牢記不要無謂的使用和浪費記憶體。
如果你有一台大記憶體的伺服器,同時對Win32作業系統中對於進程最高使用>2G記憶體的限制很鬱悶,可選的解決方案有兩個:
1、使用/3GB模式啟動電腦,方法: http://technet.microsoft.com/zh-cn/library/bb124810%28EXCHG.65%29.aspx
2、使用Windows Server 2003 64bits Edition
關於異常的疑難解答:System.OutOfMemoryException
當嘗試分配記憶體失敗時,會引發 OutOfMemoryException 異常。
相關提示
如果要建立數組,請確保其大小正確。
確保有足夠的記憶體用於內部用途和新的託管對象。
如果您正在 .NET Compact Framework 上進行編程,當沒有足夠的記憶體可用於內部用途或新的託管對象時,公用語言運行庫會引發此異常。要避免此異常,應避免編寫佔用 64KB 或更多記憶體的大方法。
備忘
過多的託管記憶體使用量量通常由以下因素造成:
1 將大型資料集讀入記憶體中。
2 建立過多的緩衝條目。
3 上傳或下載大檔案。
4 在分析檔案時過多地使用Regex或字串。
5 過多的檢視狀態。
6 工作階段狀態中有過多的資料或者會話過多。
當對 COM 物件調用一個方法,並且該方法返回包含安全陣列(大小不固定的數組)的使用者定義型別時,可能引發此異常,並附帶一條額外的訊息“儲存空間不足,無法完成此操作”。這是因為 .NET Framework 無法封送帶有安全陣列類型的結構欄位。
REF:
http://blog.csdn.net/limmo/archive/2007/01/20/1488329.aspx
http://hi.baidu.com/melovesmile/blog/item/f69efffd2309a085b901a0bb.html
http://hi.baidu.com/anwyo/blog/item/921e93132e3cf6d3f6039e75.html
http://www.cnblogs.com/kwklover/archive/2005/05/05/149787.html
http://www.360doc.com/content/06/1119/16/1_265250.shtml
IIS:w3wp.exe進程佔用cpu和記憶體過多的處理辦法 http://www.cnblogs.com/emanlee/archive/2010/02/06/1664874.html