解決 ASP.NET 中 System.OutOfMemoryException 的問題
来源:互联网 发布:网络教育大学生认证 编辑:程序博客网 时间:2024/05/20 06:54
這兩天去參加微軟技術菁英學院開的「ASP.NET 應用程式偵錯實戰專班」,雖然才短短兩天的時間,但學到的東西真是獲益良多阿,十分感謝 Terry 與 Louis 針對 Win32 Debugging 與 .NET Debugging 的精闢解析!日後如果有時間的話我也可以多分享一些關於 ASP.NET 偵錯相關技巧與心得,今天我想先分享一些關於 ASP.NET 中關於 System.OutOfMemoryException 的問題與解決方法。
我們之前也有台主機「偶而」會發生 System.OutOfMemoryException 的錯誤,原本想說可能是程式寫不好造成的,但怎麼查都查不太出來問題在哪裡,只要流量一大起來就有可能會導致這個例外狀況,完全是一籌莫展,這次去上課才得知也可能是因為 .NET 的記憶體回收行程 (GC) 所造成的問題。
之所以發生這個問題,是因為多處理器(或多核心)電腦上的 .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
原文:http://blog.miniasp.com/post/2008/05/Solve-ASPNET-SystemOutOfMemoryException-problem.aspx
--------------
在什么情况下会出现OutOfMemonryException呢 ?引<<.net框架程序设计修订版>>的话: 在我们试图新建一个对象时,而垃圾收集器又找不到任何可用内存时被抛出,这种情况下我们是可以捕获该异常的,另一种情况是,CLR需要内存时,而却系统却 不能提供,也会抛出该异常,但此时,我们的应用程序是不能捕获该错误的
<<.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请求,而将 旧进程所占用的内存回收。
微软推荐的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
关于异常的疑难解答:System.OutOfMemoryException
当尝试分配内存失败时,会引发 OutOfMemoryException 异常。
相关提示
如果要创建数组,请确保其大小正确。
确保有足够的内存用于内部用途和新的托管对象。
如果您正在 .NET Compact Framework 上进行编程,当没有足够的内存可用于内部用途或新的托管对象时,公共语言运行库会引发此异常。要避免此异常,应避免编写占用 64KB 或更多内存的大方法。
备注
过多的托管内存使用量通常由以下因素造成:
1 将大型数据集读入内存中。
2 创建过多的缓存条目。
3 上载或下载大文件。
4 在分析文件时过多地使用正则表达式或字符串。
5 过多的视图状态。
6 会话状态中有过多的数据或者会话过多。
当对 COM 对象调用一个方法,并且该方法返回包含安全数组(大小不固定的数组)的用户定义类型时,可能引发此异常,并附带一条额外的消息“存储空间不足,无法完成此操作”。这是因为 .NET Framework 无法封送带有安全数组类型的结构字段。
REF:
http://blog.csdn.net/limmo/archive/2007/01/20/1488329.aspx
http://hi.baidu.com/melovesmile/blog/item/f69efffd2309a085b901a0bb.html
http://hi.baidu.com/anwyo/blog/item/921e93132e3cf6d3f6039e75.html
http://www.cnblogs.com/kwklover/archive/2005/05/05/149787.html
原文:http://hi.baidu.com/jok607/blog/item/c59ff9f8e6515704d8f9fd60.html
- 解決 ASP.NET 中 System.OutOfMemoryException 的問題
- 解決 ASP.NET 中 System.OutOfMemoryException 的問題
- ASP.NET 中关于 System.OutOfMemoryException 的问题与解决方法
- ASP.NET 中关于 System.OutOfMemoryException 的问题与解决方法
- 解决 ASP.NET 中 System.OutOfMemoryException 的问题
- .Net System.OutOfMemoryException
- ASP.NET中的OutOfMemoryException
- ASP.NET中的OutOfMemoryException
- .Net 内存溢出(System.OutOfMemoryException
- 引发类型为“System.OutOfMemoryException”的异常-.Net 内存溢出
- System.OutOfMemoryException: 引发类型为“System.OutOfMemoryException”的异常
- 解决'System.OutOfMemoryException' 的问题
- System.OutOfMemoryException
- System.OutOfMemoryException
- System.OutOfMemoryException
- System.OutOfMemoryException
- System.OutOfMemoryException
- System.OutOfMemoryException
- delphi 编译是报compiled with a different version的原因
- .net实例:使用C++调用C#的DLL
- JAVA2核心技术学习(一)
- 循环复用DNS实现多服务器的负载均衡
- 挂断电话的代码片段
- 解決 ASP.NET 中 System.OutOfMemoryException 的問題
- solaris中fibre channel protocol 驱动的问题以及调试
- 服装面辅料编码方案
- 屏幕坐标向OpenGL坐标的转换(完整版)(转载)
- JavaScript正则表达式
- 将datatable表的bool字段显示为想要的汉字 AND希望一行只显示定长字符,多出来的部分以省略号代替
- 一个比较完善的PHP购物车类
- SQL Server中pivot and unpivot的用法 (行列互转)
- Web安全开发:SQL注入攻击和网页挂马