如何处理OutOfMemoryException异常 ?


今天在浏览CSDN的网站,出现了上图的错误,如果没有记错的话,这两个错误我经常都能碰到,在这里我不想说CSDN现在如何失去人心的大话题,而是想和大家探讨如何解决这两个问题(这里只考虑web app),以便在自己的系统中避免这种不友好,甚至会"吓坏"客户的界面的出现

一,运行时错误
首先程序的异常,甚至错误是在所难免的,但当系统出现异常时,应该提供给用户一个友 好的界面,并简单说明原因,对这个问题,我一般的解决办法是
<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异常提供友

好界面 ?

大家能否讨论一下,提供你的解决方案 ?
这里有一个不错的解决tips

posted @ 2005-05-05 21:19 kwklover 阅读(16079) 评论(13) 编辑 收藏

 回复 引用 查看   
#1楼2005-05-05 22:06 | 奋斗中的灵感之源      
强心gc.collect :D
 回复 引用 查看   
#2楼2005-05-05 23:17 | 龙蛰(NeoLee)      
iis在默认情况下,只能使用800M内存(iis6.0也一样)。
可以考虑用使用另外一个应用程序域专门处理OutOfMemoryException

 回复 引用 查看   
#3楼[楼主]2005-05-06 15:04 | kwklover      
@龙蛰(NeoLee)
你的意思是说在IIS下运行的WEB APP每一个应用程序域可以使用的内存都可以在IIS里设置的 ?

如果是这样的话,我们可以开发另一个应用程序来检测另一个应用程序的异常情况 ?我的理解是不能跨应用程序域捕获异常吧 ?


 回复 引用   
#4楼2005-05-06 17:33 | joedong
必须设定在进程使用内存到一定量后内存自动回收,IIS6 可以在应用程序池管理属性里设置。IIS5必须借助IISRecyle这个工具
 回复 引用 查看   
#6楼[楼主]2005-05-07 22:38 | kwklover      
@kaneboy
看过你文章了,写的很深入
现在看来完全防止OutOfMemoryException异常的产生,涉及的面还是很广的
IIS的设置和应用程序的编写是否优秀也有很大的关系

 回复 引用   
#7楼2005-05-09 10:23 | 菩提树
我用的是IIS自动循环回收资源,安排在系统负载最小的时段进行回收(比如凌晨5点)
 回复 引用   
#8楼2006-10-14 11:13 | 醉梦流仙[未注册用户]
事实上,OutOfMemoryException只需要try catch就好了,是可以处理的。
 回复 引用 查看   
#9楼2008-11-28 09:54 | 执迷不悟      
Application_Error里可以捕获的!
 回复 引用 查看   
#10楼2009-08-17 16:17 | itpob      
@醉梦流仙

当发生OOM后,正确的做法是failfast,尽快结束进程。避免由于OOM带来数据损坏等更严重的损失。使用catch去抓OOM,然后尝试恢复,是错误的做法.