»點此完善

網站簡介-內存溢出問題:OutOfMemoryException異常應如何處理?

內存溢出問題:OutOfMemoryException異常應如何處理?

一, 運行時錯誤

首先程序的異常,甚至錯誤是在所難免的,但當系統出現異常時,應該提供給用戶一個友好的界面,并簡單說明原因,對這個問題,我一般的解決辦法是
《customErrors mode="Off" /》 這里可以不用配置
然后在HttpModule的Application_Error事件中檢測所有Error,并跳轉到指定友好頁面。另外也可以在所有頁面的基類的Page_Error事件中檢測,并跳轉到指定友好頁面,ASP.NET forums提供的解決方案,我覺得已經很優秀了,博客堂的寶玉提供這方面的很好的介紹

二, OutOfMemoryException異常如何處理

在什么情況下會出現OutOfMemonryException呢?

引《《.net框架程序設計修訂版》》的話: 在我們試圖新建一個對象時,而垃圾收集器又找不到任何可用內存時被拋出,這種情況下我們是可以捕獲該異常的,另一種情況是,CLR需要內存時,而卻系統卻不能提供,也會拋出該異常,但此時,我們的應用程序是不能捕獲該錯誤的。

《《.net框架程序設計修訂版》》把OutOfMemoryException異常列為開發人員幾乎從來不會考慮的隱含假設,也就是說,很多開發人員根本不考慮該異常發生的可能并做出處理,起碼我在我開發的系統里并沒有專門考慮這個異常

我現在考慮的問題是:
1,如果是新建對象找不到可用內存拋出該異常,那么在HttpModule的Application_Error事件能否捕獲改錯誤?我的想法是,即使可以捕獲,也是不能得到處理的,因為自定義的異常處理仍然需要內存來運行,所以無論能否捕獲,都不能做友好處理

2,如果CLR找不到需要的內存情況下拋出改異常,那就更不能處理了

也就是說,幾乎在任何情況下,我們都無法在系統出現OutOfMemoryException異常提供友好界面?

服務器配置方面

1. 安裝.NET Framework 1.1 Service Pack 1補丁部分解決了一些內存泄漏的問題,下載地址為:http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=a8f5654f-088e-40b2-bbdb-a83353618b38

2.使用更多的內存
    a.打開/3GB Switch(如果你有3GB以上的內存)。這個配置只在Windows 2000 Advanced Server和Data Center版本以及Windows Server 2003以上才支持,參見:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag/html/scalenetchapt17.asp
http://support.microsoft.com/default.aspx?scid=kb;en-us;820108
    b.即使你有很多內存,但.NET(注意不是ASP.NET工作進程,而是.NET整個使用的內存是有一定限制的,可以通過加大配置使用量來減少內存溢出的發生。方法如下:修改machine.config文件,一般在%System%/Microsoft.Net/Framework/v1.1.4322/CONFIG目錄中, 修改processModel元素中的memoryLimit,大于缺省設置的60(意味著物理內存的60%)。

3.回收工作線程

設置IIS定期清除Work process是避免此異常的一個較好的方式。但這個功能是IIS 6.0(也就是Windows 2003上帶的IIS)才支持。配置方法如下:修改IIS的應用程序池配置,選擇DefaultAppPool(如果你的系統是用這個池),右鍵點屬性-》Recycling Setting,然后選擇根據情況 修改“Recycle worker processes at the following times:'等幾項配置,其中定時回收工作進程是一個比較好的方式,可以避免回收工作進程時,引起客戶Session丟失。
Windows 2000 server 上安裝的是IIS 5.0,本身不支持Recycle,但要想實現這個功能也不難。微軟針對IIS提供的IIS5Recycle便是這樣一個程序,它安裝后以服務形式提供回收工作進程。
安裝說明見http://support.microsoft.com/?id=322350

代碼編寫方面的注意問題

1.System.Drawing方面的類使用問題
System.Drawing用到了很多系統的資源和非托管代碼,所以使用的時候要特別小心,注意內存泄漏(Memory Leak)例如:BitMap.MakeTransparent方法的使用問題:http://www.dotnet247.com/247reference/msgs/40/202528.aspx

2.new byte[]問題
處理流的時候常常會用到new一個大的byte數組。但在多用戶情況下會消耗大量的內存。正確的做法應該是定義一個比較小的byte數組做為緩存,然后循環使用。如在我們的程序中,有些地方使用不當,當圖片(或附件)過大或過多的時候, new byte[length]就有可能消耗過多的內存。
3. 避免使用大對象數組或小對象大數組
編程時同樣要重視效率問題(包括內存占用問題)。
4.Com接口調用是要注意釋放對象。
posted on 2005-01-25 13:37 Chainet
事件類型:錯誤
事件來源:Application
事件種類:無
事件 ID:0
日期:2005-11-19
事件:15:40:49
用戶:N/A
計算機:WEBHOST1
描述:事件 ID ( 0 )的描述(在資源( Application )中)無法找到。本地計算機可能沒有必要的注冊信息或消息 DLL 文件來從遠程計算機顯示消息。您可能可以使用 /AUXSOURCE= 標識來檢索詞描述;查看幫助和支持以了解詳細信息。下列信息是事件的一部分: System.OutOfMemoryException: 發生類型為 System.OutOfMemoryException 的異常。
http://blog.joycode.com/kaneboy/archive/2005/05/07/50409.aspx

ASP.NET中的OutOfMemoryException

在博客園看到了一位園友寫的文章《如何處理OutOfMemoryException異常?》,于是想和大家交流一下ASP.NET中出現OutOfMemoryException的問題。
實際上,在ASP.NET Web服務器上,ASP.NET所能夠用到的內存,通常不會等同于所有的內存數量。在machine.config配置文件中,配置節《processModel》中有一個屬性“memoryLimit”,這個屬性的值是一個百分值,默認為“60”,即指定了ASP.NET進程(在任務管理器中大家就可以看到ASP.NET的進程,IIS5中為aspnet_wp,IIS6中為w3wp)能夠使用所有物理內存的60%。當ASP.NET使用的內存量超過這個限額時,IIS會開始自動回收(recycle)進程,即創建一個新的進程去負責應付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管理器中的應用程序池配置中的設置決定。
但是,即使正確設置了這些配置,也不能保證完全避免OutOfMemoryException的發生,原因可能是多樣而復雜的,比如內存回收操作可能耗時太多等等。開發人員要注意的,就是在代碼中時刻牢記不要無謂的使用和浪費內存。:)

之所以發生System.OutOfMemoryException這個問題,是因為多處理器(或多核心)計算機上的 .NET CLR 的 Garbage Collection (GC) 機制默認是使用 Server Mode (服務器模式) 在運行的,換句話說,就是「每一顆 CPU 都會有獨立的 GC 內存空間(堆棧, Heap)」,所以如果你的 GC 內存空間 用掉了 500MB 且你有 4 顆 CPU 的話,就等于耗費了 2GB 的內存,進而發生 System.OutOfMemoryException 異常!
要解決這個問題的方式就是將 GC 設置為 Workstation Mode (工作站模式),這樣就可以整臺主機共享同一個 GC Heap,以節省內存的使用。要將預設的 GC 修改成 Workstation Mode 必須要修改 %WINDIR%/Microsoft.NET/Framework/v2.0.50727/Aspnet.config 配置文件 ( 如果是 .NET 1.1 要修改 %WINDIR%/Microsoft.NET/Framework/v1.1.4322/Aspnet.config 配置文件 ):
預設的 Aspnet.config 長這樣:

《?xml version="1.0" encoding="UTF-8" ?》
《configuration》
   《runtime》
     《legacyUnhandledExceptionPolicy enabled="false" /》
     《legacyImpersonationPolicy enabled="true"/》
     《alwaysFlowImpersonationPolicy enabled="false"/》
     《SymbolReadingPolicy enabled="1" /》
   《/runtime》
《/configuration》
需加上一行 《gcServer enabled="false"/》 如下:
《?xml version="1.0" encoding="UTF-8" ?》
《configuration》
   《runtime》
     《gcServer enabled="false" /》
     《legacyUnhandledExceptionPolicy enabled="false" /》
     《legacyImpersonationPolicy enabled="true"/》
     《alwaysFlowImpersonationPolicy enabled="false"/》
     《SymbolReadingPolicy enabled="1" /》
   《/runtime》
《/configuration》

這樣就設置完成了!

不過像這種出現 Out of Memory 的異常在 64 位的操作系統中幾乎不會出現問題,所以如果你是使用 64 位的操作系統(如:Windows Server 2003 64bit ) 的話,是不太需要做這樣的調整的,但你的內存還是要夠多才行,否則過多的分頁狀況還是會降低你 ASP.NET 應用程序的執行性能!

除了這點之外,在正式(Production)環境中的 ASP.NET 應用程序一定要在 web.config 中關閉開發時期設定的 debug 與 trace,才不會對內存造成額外的負擔。因為 ASP.NET 應用程序在啟用 debug mode 的時候所有的 Symbol 檔(*.pdb)都會被加載到內存中,不但會消耗不少內存,也會降低執行效能。詳情請見微軟知識庫:Quick things to check when you experience high memory levels in ASP.NET。


0430.com推薦
上壹站:  內容為王:如何做好網站內容?
當前推薦網站:  內存溢出問題:OutOfMemoryException異常應如何處理?
下壹站:  內存溢出(out of memory)是內存不夠嗎?


申明:本資料由全球網站庫會員提供,轉載請註明出處,資料來源:http://cht.0430.com/cn/web237471/。
內存溢出問題:OutOfMemoryException異常應如何處理? 感謝您的支持與分享!

»如果您覺得'內存溢出問題:OutOfMemoryException異常應如何處理?'相關資料不全,請點此協作更新!
復制本頁網址,與您QQ/MSN上的好友分享,就是您對0430網站庫最大的支持!
踩踩此網站0
支持此網站1
(站長之聲:支持本站,就來頂壹下吧!)  
現在有1人對'內存溢出問題:OutOfMemoryException異常應如何處理?'發表評論 »查看全部評論
您的姓名: * 可選項,留空即為匿名發表
評論內容:
剩余字數:  * 按 Ctrl + Enter 發送.
           
全球網站庫溫馨提示:資料由cht.0430.com會員自行發布,請大家自辯真偽;評論只需提交壹次,請耐心等候審核通過,方可顯示.
網站版本: English  中文(简体)  中文(繁體)  日本語  Español
關於我們 | 聯系我們 | 貢獻網站 | 免責聲明 | 友情鏈接 | 意見反饋 | 分類目錄 | 收錄條件 | 返回頂部
Copyright 2004-2020 版權所有 cht.0430.com
網站聲明:本網站所分享網站資料取之於網、用之於網,請大家參考使用時自行辨明、後果自負,0430不承擔任何責任。
全球網站庫 - 二十四小時在線的免費頂級網站目錄 - 讓網站與我們的生活更近!