ASP.NET中的OutOfMemoryException
在博客園看到了一位園友寫的文章《如何處理OutOfMemoryException異常?》,于是想和大家交流一下ASP.NET中出現(xiàn)OutOfMemoryException的問題。
實際上,在ASP.NET Web服務(wù)器上,ASP.NET所能夠用到的內(nèi)存,通常不會等同于所有的內(nèi)存數(shù)量。在machine.config配置文件中, 配置節(jié)<processModel>中有一個屬性“memoryLimit”,這個屬性的值是一個百分值,默認(rèn)為“60”,即指定了ASP.NET進(jìn)程(在任務(wù)管理器中大家就可以看到ASP.NET的進(jìn)程,IIS5中為aspnet_wp,IIS6中為w3wp)能夠使用所有物理內(nèi)存的60%。當(dāng)ASP.NET使用的內(nèi)存量超過這個限額時,IIS會開始自動回收(recycle)進(jìn)程,即創(chuàng)建一個新的進(jìn)程去負(fù)責(zé)應(yīng)付Http請求,而將舊進(jìn)程所占用的內(nèi)存回收。
當(dāng)我們有一臺很大內(nèi)存的服務(wù)器時,“memoryLimit”這個值是需要進(jìn)行適當(dāng)?shù)恼{(diào)整的。比如我們準(zhǔn)備了一臺4G內(nèi)存的服務(wù)器,那么4G×60%=2.4G。但是,對于Win32操作系統(tǒng),一個進(jìn)程所能占用的所有內(nèi)存空間只有2G。當(dāng)ASP.NET進(jìn)程占用的內(nèi)存開始達(dá)到2G時,由于它并沒有達(dá)到2.4G的“回收閾值”,所以IIS不會啟動recycle進(jìn)程操作,但是由于Win32的限制,實際上已經(jīng)不能給這個進(jìn)程分配更多的內(nèi)存了,于是,OutOfMemoryException就很可能會被拋出了。為了避免這樣的情況,我們就必須將“memoryLimit”適當(dāng)調(diào)小,以讓IIS更早的進(jìn)行進(jìn)程回收。
微軟推薦的ASP.NET進(jìn)程占用內(nèi)存是不超過60%,并最好使計算出的實際值不超過800M。就是說,對于一臺4G內(nèi)存的服務(wù)器,最好將“memoryLimit”屬性設(shè)置成“20”。設(shè)置一個適當(dāng)?shù)幕厥臻撝?#xff0c;讓IIS適時的進(jìn)行進(jìn)程回收,對于保證整個服務(wù)器的穩(wěn)定運行,避免OutOfMemoryException是非常重要的。
在IIS6中,ASP.NET進(jìn)程的回收閾值不再由 配置節(jié)中的“memoryLimit”屬性決定,而是由IIS管理器中的應(yīng)用程序池配置中的設(shè)置決定。
但是,即使正確設(shè)置了這些配置,也不能保證完全避免OutOfMemoryException的發(fā)生,原因可能是多樣而復(fù)雜的,比如內(nèi)存回收操作可能耗時太多等等。開發(fā)人員要注意的,就是在代碼中時刻牢記不要無謂的使用和浪費內(nèi)存。:)
如果你有一臺大內(nèi)存的服務(wù)器,同時對Win32操作系統(tǒng)中對于進(jìn)程最高使用2G內(nèi)存的限制很郁悶,可選的解決方法有兩個:
1、使用/3GB模式啟動計算機,方法參加文后的鏈接
2、使用Windows Server 2003 64bits Edition
資源鏈接:
Microsoft IIS 5.0 Process Recycling Tool,使IIS5具有類似IIS6的進(jìn)程監(jiān)視回收功能
Microsoft KB: Information on Application Use of 4GT RAM Tuning
Microsoft KB: 4 GB RAM 調(diào)試功能和物理地址擴展開關(guān)介紹
總結(jié)
以上是生活随笔為你收集整理的ASP.NET中的OutOfMemoryException的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Liferay SSO CAS 集成
- 下一篇: [数据库字典]简单的3个SQL视图搞定所