OutOfMemoryException问题的处理

介绍
我所参与做的产品是一个比较大型的ASP.NET系统,在测试部门和客户那里,如果长时间运行,系统常常会出现一些OutOfMemoryException的异常。引起内存溢出的错误的原因有很多,主要在服务器配置方面和代码编写两个方面可以进行优化和改进,避免此类问题的出现,但完全杜绝是比较困难的。下面是我收集整理的一些解决方法。 

服务器配置方面

        1.   安装.NET Framework 1.1 Service Pack 1

补丁部分解决了一些内存泄漏的问题,下载地址为:http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=a8f5654f-088e-40b2-bbdb-a83353618b38 
        2.   使用更多的内存

                a.打开/3GB Switch(如果你有3GB以上的内存)。这个配置只在Windows 2000 Advanced Server和Data Center版本以及Windows Server 2003以上才支持,参见:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag/html/scalenetchapt17.asp

http://support.microsoft.com/default.aspx?scid=kb;en-us;820108

                b.即使你有很多内存,但.NET(注意不是ASP.NET工作进程,而是.NET整个使用的内存是有一定限制的,可以通过加大配置使用量来减少内存溢出的发生。方法如下:

修改machine.config文件,一般在 %System%\Microsoft.Net\Framework\v1.1.4322\CONFIG目录中, 修改processModel元素中的memoryLimit,大于缺省设置的60(意味着物理内存的60%)。

        3. 回收工作线程

设置IIS定期清除Work process是避免此异常的一个较好的方式。但这个功能是IIS 6.0(也就是Windows 2003上带的IIS)才支持。

配置方法如下:

修改IIS的应用程序池配置,选择DefaultAppPool(如果你的系统是用这个池),右键点属性->Recycling Setting,然后选择根据情况 修改“Recycle worker processes at the following times:'等几项配置,其中定时回收工作进程是一个比较好的方式,可以避免回收工作进程时,引起客户Session丢失。

Windows 2000 server 上安装的是IIS 5.0,本身不支持Recycle,但要想实现这个功能也不难。微软针对IIS提供的IIS5Recycle便是这样一个程序,它安装后以服务形式提供回收工作进程。

安装说明见http://support.microsoft.com/?id=322350

图片是表示安装好之后的配置信息! 是不是和IIS6中的一模一样?


代码编写方面的注意问题 

1.System.Drawing方面的类使用问题

System.Drawing用到了很多系统的资源和非托管代码,所以使用的时候要特别小心,注意内存泄漏(Memory Leak)例如:BitMap.MakeTransparent方法的使用问题:

http://www.dotnet247.com/247reference/msgs/40/202528.aspx

2.new byte[]问题

处理流的时候常常会用到new一个大的byte数组。但在多用户情况下会消耗大量的内存。正确的做法应该是定义一个比较小的byte数组做为缓存,然后循环使用。如在我们的程序中,有些地方使用不当,当图片(或附件)过大或过多的时候, new byte[length]就有可能消耗过多的内存。

3.  避免使用大对象数组或小对象大数组

编程时同样要重视效率问题(包括内存占用问题)。

4.Com接口调用是要注意释放对象。

**System.OutOfMemoryException 是当系统没有足够的内存继续执行程序时引发的异常**。 这个异常通常出现在应用程序尝试分配更多内存,但可用内存不足时。例如,如果一个应用程序试图创建一个大对象数组或者一个 StringBuilder 对象超过了其 MaxCapacity 属性定义的长度,而系统无法提供所需的连续内存空间,就会抛出此异常。 在ASP.NET环境中,System.OutOfMemoryException可能由于IIS进程使用的内存超过了配置的上限而导致。在machine.config文件中,<processModel>元素有一个memoryLimit属性,该属性指定了ASP.NET进程可以使用的物理内存百分比。默认情况下,这个值被设置为60%,即ASP.NET进程最多只能使用总物理内存的60%。如果超出这个限制,IIS会尝试通过回收(recycle)旧进程并创建新进程来处理请求,但如果系统为每个进程能够分配的最大内存量(如在Win32系统中通常是2GB)已经被使用完,即使实际的内存使用没有达到memoryLimit设置的百分比,也可能会引发OutOfMemoryException。 解决此类问题的方法包括增加服务器物理内存、优化应用程序以减少内存消耗、调整memoryLimit的值,或者在编写代码时确保及时释放不再需要的对象以释放内存。 需要注意的是,即使进行了这些调整,也不能保证完全避免OutOfMemoryException的发生,因为可能还有其他因素导致内存不足,比如内存回收操作耗时太多等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值