大型 ASP.NET Web 應用常遇到 OutOfMemoryException,根因在於 IIS 工作進程的記憶體限制(32 位元環境約 800MB-1GB 有效上限)。本文綜合硬體、IIS 設定、框架配置、程式碼優化與異常攔截五個維度的緩解方案。
32 位元 IIS 單進程虛擬記憶體上限約 2GB,實際可用常低於 1GB。超過 2GB 實體記憶體對單純 Web 伺服器邊際效益遞減,建議投資多核心 CPU 提升並行處理能力。
IIS5Recycle 服務定期回收工作進程<processModel memoryLimit="60" /> <!-- 預設 60%,需依實體記憶體換算 800MB 閾值 -->
例:4GB 記憶體伺服器,800MB ≈ 20%,設 memoryLimit="20" 觸發主動回收,避免觸及系統硬性上限導致異常。
Dispose() 釋放非託管資源(資料庫連線、檔案流、GDI+ 物件)try
{
// 業務邏輯
}
catch (OutOfMemoryException)
{
GC.Collect(); // 強制回收,嘗試續命
throw; // 重新拋出或導向錯誤頁
}
警示:頻繁強制 GC 會嚴重影響效能,僅作為最後防線,不可常態化。
32 位元啟用 /3GB 啟動參數可將使用者模式空間擴至 3GB,但對純 Web 應用改善有限,且可能導致核心資源不足。建議直接遷移至 64 位元 ASP.NET / IIS 徹底解決記憶體天花板。