1. 程式人生 > >iis應用程式池 記憶體溢位錯誤 System.OutOfMemoryException

iis應用程式池 記憶體溢位錯誤 System.OutOfMemoryException

前幾天在省防辦進行伺服器移植的時候,換了一臺新的應用伺服器,記憶體4G,2個cpu,每個是4核,按理說效能很好了,環境:windows2003 iis6.0。可能奇怪的是最近居然出現訪問pda網站不穩定的情況,出現System.OutOfMemoryException 錯誤,一開始以為記憶體溢位,會不會是資料庫伺服器效能問題,記憶體不夠用,但是資料庫伺服器沒變過,就是iis伺服器換了新的,反而出錯,在網上搜索了很多相關資料,才知道可能是iis伺服器的記憶體分配問題,是在iis的應用程式池中進行配置的。

詳見這篇文章:

在部落格園看到了一位園友寫的文章,於是想和大家交流一下ASP.NET中出現OutOfMemoryException

的問題。實際上,在ASP.NET Web伺服器上,ASP.NET所能夠用到的記憶體,通常不會等同於所有的記憶體數量。在machine.config配置檔案中,配<processModel>中有一個屬性“memoryLimit”,這個屬性的值是一個百分值,預設為“60”,即指定了ASP.NET程序(在工作管理員中大家就可以看到ASP.NET的程序,IIS5中為aspnet_wpIIS6中為w3wp)能夠使用所有實體記憶體的60%。當ASP.NET使用的記憶體量超過這個限額時,IIS會開始自動回收(recycle)程序,即建立一個新的程序去負責應付Http請求,而將舊程序所佔用的記憶體回收。
當我們有一臺很大記憶體的伺服器時,“memoryLimit”這個值是需要進行適當的調整的。比如我們準備了一臺chemas-microsoft-com ffice marttags" />t="on">4G記憶體的伺服器,那麼t="on">4G×60%t="on">2.4G。但是,對於Win32作業系統,一個程序所能佔用的所有記憶體空間只有t="on">2G。當ASP.NET程序佔用的記憶體開始達到t="on">2G時,由於它並沒有達到t="on">2.4G回收閾值,所以IIS不會啟動recycle程序操作,但是由於Win32的限制,實際上已經不能給這個程序分配更多的記憶體了,於是,
OutOfMemoryException就很可能會被丟擲了。為了避免這樣的情況,我們就必須將“memoryLimit”適當調小,以讓IIS更早的進行程序回收。微軟推薦的ASP.NET程序佔用記憶體是不超過60%,並最好使計算出的實際值不超過t="on">800M。就是說,對於一臺t="on">4G記憶體的伺服器,最好將“memoryLimit”屬性設定成“20”。設定一個適當的回收閾值,讓IIS適時的進行程序回收,對於保證整個伺服器的穩定執行,避免OutOfMemoryException是非常重要的。IIS6中,ASP.NET程序的回收閾值不再由配置節中的“memoryLimit”屬性決定,而是由IIS管理器中的應用程式池配置中的設定決定。但是,即使正確設定了這些配置,也不能保證完全避免OutOfMemoryException的發生,原因可能是多樣而複雜的,比如記憶體回收操作可能耗時太多等等。開發人員要注意的,就是在程式碼中時刻牢記不要無謂的使用和浪費記憶體。:)

如果你有一臺大記憶體的伺服器,同時對Win32作業系統中對於程序最高使用t="on">2G記憶體的限制很鬱悶,可選的解決方法有兩個:
1
、使用/3GB模式啟動計算機,方法參加文後的連結
2
、使用Windows Server 2003 64bits Edition

資源連結:,使IIS5具有類似IIS6的程序監視回收功能