相信做ASP.NET中大型Web應用的人都碰到過OutOfMemoryException這個異常,對於這個問題我研究了很久,在微軟的技術文檔上也瞭解過此問題出現的原因,說實話,到目前我仍然沒有完美的解決方案,這裡只是把我處理該問題的一些經驗提出來和大家一起分享,儘可能的避免該問題的發生。
1) 首先,在硬體的配置上,出現該問題的原因我想很多人已經知道了,那就是IIS對於記憶體的管理存在一些限制,普遍的認識是800M的線程記憶體使用量上限(通過我的一些客戶實踐證明的確如此,甚至更低...),不管是w3wp還是aspnet_wp,這個限制對ASP.NET應用伺服器的機器配置而言其意義是很明顯的,超過2G的記憶體對於單純的Web伺服器而言作用是很微小的,所以在Web伺服器的配置上可在CPU的數量方面多考慮。
2) IIS配置上的方案,IIS5.0可安裝一個IIS5Recycle程式,該程式採用服務的形式來回收背景工作處理序,安裝說明:http://support.microsoft.com/?id=322350,對於IIS6.0可以在應用程式集區的配置上設定自動回收背景工作執行緒的時間,我一般都會設在淩晨2點:)
3) 在.NET Framework的配置上,修改machine.config設定檔中的配置節<processModel>的屬性“memoryLimit”,這個屬性的值預設為“60”,是一個百分比資料,我們需要按照伺服器實際的記憶體數,再根據800M的上限來設定這個值,那麼在達到這個閥值時IIS會自動回收進程
4) 在Web應用程式的開發中,必須儘可能的減少對記憶體使用量的浪費,及時釋放資源,我想說明的有3點:1、通過代碼主動調用Dispose方法進行資源釋放,2、對於實體類儘可能複用,不做多餘的聲明和建立,3、減少Session的使用,縮短Session的有效期間,尤其對於大資料對象盡量不要儲存在Session中
5) 一個比較通用的辦法,在Web應用程式的基類中通過try{}catch{}來主動捕捉OutOfMemoryException異常,發現該異常後直接調用GC.Collect()進行強制記憶體回收。
最後,有很多朋友提到32位系統對於大記憶體使用量方面可以開啟3G模式,這個本身沒有什麼問題,只是根據個人經驗,其對單純Web應用程式的協助不大,如果Web伺服器還有更多的用途當然也建議採用此模式.
希望對大家處理此問題有協助.