您现在的位置:龙卷风首页 ›› 网络编程 ›› 阅读文章

ASP.NET中的OutOfMemoryException,内存的问题

asp.net发生 OutOfMemoryException 错误,设置asp.net使用大内存服务器。

在做潮汕风情网的图库功能时,碰到OutOfMemoryException 错误。那是在上传大图片的时候。程序通过

System.Drawing.Image.FromStream

将输入流读入内存。然而图片只有70mb大小,按理说应该不会达到内存的上限啊,因为本机的内存有1.87GB呢。查阅了一下资料,才发现asp.net的内存机制还有这么多学问呢!

下面文字引用自:http://www.360doc.com/content/061119/16/1_265250.html

实际上,在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的发生,原因可能是多样而复杂的,比如内存回收操作可能耗时太多等等。开发人员要注意的,就是在代码中时刻牢记不要无谓的使用和浪费内存。:)

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

大内存的使用

下面文字引用自:http://www.haoxiai.net/wangzhanzhizuo/aspnet/28076.html

从去年起我们的服务器偶尔会抛出OutOfMemoryException,即没有足够的内存继续执行程序时引发的异常。服务器内存加到4G也仍会出现该问题。软件是UO的第三方模拟器。事实上,从任务管理器里,可以看到软件占用了约1G左右的内存,当然因为GC的缘故,实际软件使用的内存在600M左右。为避免超过1G多内存的占用,并抛出Outofmemory异常,设定在内存占用到一定值时进行强制GC,一下子可以减去几百兆,但终究是没彻底解决问题。
最近国外论坛贴了相关处理方法,在此转述一遍,希望对遇到类似问题的朋友有帮助。


对于2G内存的服务器,.Net只能使用1.2G内存。
对于4G内存的服务器,.Net可使用2.4G内存。但系统需要进行如下设置:
1、 在boot.ini文件中增加/3GB的开关。
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(2)\WINNT
[operating systems]
multi(0)disk(0)rdisk(0)partition(2)\WINNT="????" /3GB
2、在命令行窗口,进入该目录,如 cd "C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin"
3、运行link命令: link -edit -LARGEADDRESSAWARE server.exe (server.exe为你的.Net程序)
4、你的server.exe就可以使用到2.4G内存了

.Net 1.2好像没解决这个问题,新的2.0还没空做测试,不知道2.0在内存管理和GC的性能上有无大的变化。

作者 不见不散 本文仅代表作者观点,与龙卷风资讯网立场无关。

我来说两句

内容/Content