Kaneboy's SharePoint Blog

SharePoint & Office Zealot
随笔 - 390, 评论 - 8093, 引用 - 201

导航

关于


About me :
SharePoint Architect, MCPD, MCTS, MCT, ex-MVP

Contact me :
kaneboy@gmail.com | follow @kaneboy on twitter



标签

每月存档

最新留言

广告

 

在博客园看到了一位园友写的文章《如何处理OutOfMemoryException异常?》,于是想和大家交流一下ASP.NET中出现OutOfMemoryException的问题。

实际上,在ASP.NET Web服务器上,ASP.NET所能够用到的内存,通常不会等同于所有的内存数量。在machine.config配置文件中,<processModel>中有一个属性“memoryLimit”,这个属性的值是一个百分值,默认为“60”,即指定了ASP.NET进程(在任务管理器中大家就可以看到ASP.NET的进程,IIS5中为aspnet_wpIIS6中为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的发生,原因可能是多样而复杂的,比如内存回收操作可能耗时太多等等。开发人员要注意的,就是在代码中时刻牢记不要无谓的使用和浪费内存。:)

如果你有一台大内存的服务器,同时对Win32操作系统中对于进程最高使用2G内存的限制很郁闷,可选的解决方法有两个:
1
、使用/3GB模式启动计算机,方法参加文后的链接
2
、使用Windows Server 2003 64bits Edition

资源链接:
Microsoft IIS 5.0 Process Recycling Tool
,使IIS5具有类似IIS6的进程监视回收功能
Microsoft KB: Information on Application Use of 4GT RAM Tuning
Microsoft KB: 4 GB RAM 调试功能和物理地址扩展开关介绍

打印 | 张贴于 2005-05-07 19:39:00 | Tag:ASP.NET

留言反馈

#IIS 6进程CPU占用率50%,一段时间后,网站崩掉,如何处理? (downmoon) 编辑
IIS 6进程CPU占用率50%,一段时间后,网站崩掉,如何处理?
2007-12-29 15:06:00 | [匿名:邀月]
#IIS 6进程CPU占用率50%,一段时间后,网站崩掉,如何处理? (downmoon) 编辑
IIS 6进程CPU占用率50%,一段时间后,网站崩掉,如何处理?
2007-06-19 10:53:00 | [匿名:downmoon]
#回复: ASP.NET中的OutOfMemoryException 编辑
需要指出的是: 程序所占用的>2G的话.
IIS自动重新启动.但是,每次初始化的时候当数据>2G时,自动重新启动.
这样IIS就处在一个死循环中.不断的从新启动.
我们,在程序设计的时候要特别注意这个问题.
因为,如果不对你Cache的大小加以限制的话.哪肯定会出现这个问题.
不过,只是时间问题.
2007-01-29 13:10:00 | [匿名:Edison Lz]
#re: ASP.NET中的OutOfMemoryException 编辑
微软推荐的ASP.NET进程占用内存是不超过60%,并最好使计算出的实际值不超过800M, 有连接吗?
2006-07-17 22:08:00 | [匿名:real]
#ASP.NET中的OutOfMemoryException 编辑
ASP.NET中的OutOfMemoryException
2006-05-12 09:56:00 | [匿名:suilam]
#re: ASP.NET中的OutOfMemoryException 编辑
那对于非asp.net的程序呢,比如Application所用的memory的限制在哪里设置?谢了
2005-05-09 17:32:00 | [匿名:rose花开]
#re: ASP.NET中的OutOfMemoryException 编辑
有点confused的地方是,IIS6的内存回收应该是独立于.NET的GC的,那么为什么GC不去回收内存呢。
2005-05-09 13:24:00 | [匿名:ray_linn]
#re: ASP.NET中的OutOfMemoryException 编辑
看来博客堂从开心到kaneboy到zhanbo到子颖到……列位老兄都在欢度黄金周?
2005-05-08 06:11:00 | [匿名:leelee]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode.MVC引擎 0.5.2.0