ASP.NET 的内存不足问题

ASP.NET中的OutOfMemoryException 问题

OutOfMemoryException异常如何处理
在什么情况下会出现OutOfMemonryException呢 ?引<<.net框架程序设计修订版>>的话: 在我们试图新建一个对象时,而垃圾收集器又找不到任何可用内存时被抛出,这种情况下我们是可以捕获该异常的,另一种情况是,CLR需要内存时,而却系统却不能提供,也会抛出该异常,但此时,我们的应用程序是不能捕获该错误的

<<.net框架程序设计修订版>>把OutOfMemoryException异常列为开发人员几乎从来不会考虑的隐含假设,也就是说,很多开发人员根本不考虑该异常发生的可能并做出处理,起码我在我开发的系统里并没有专门考虑这个异常

我现在考虑的问题是:
1,如果是新建对象找不到可用内存抛出改异常,那么在HttpModule的Application_Error事件能否捕获改错误 ?我的想法是,即使可以捕获,也是不能得到处理的,因为自定义的异常处理仍然需要内存来运行,所以无论能否捕获,都不能做友好处理

2,如果CLR找不到需要的内存情况下抛出改异常,那就更不能处理了



实际上,在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” 这个值是需要进行适当的调整的。比如我们准备了一台chemas-microsoft-com ffice marttags" />t="on">4G 内存的服务器,那么t="on">4G×60% t="on">2.4G 。但是,对于Win32操作系统,一个进程所能占用的所有内存空间只有t="on">2G ASP.NET 进程占用的内存开始达到t="on">2G 时,由于它并没有达到t="on">2.4G 回收阈值,所以IIS 不会启动recycle 进程操作,但是由于Win32 的限制,实际上已经不能给这个进程分配更多的内存了,于是,OutOfMemoryException 就很可能会被抛出了。为了避免这样的情况,我们就必须将“memoryLimit” 适当调小,以让IIS 更早的进行进程回收。

微软推荐的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

你可能感兴趣的:(asp.net)