您的位置:首页 > 编程学习 > ASP.NET > 正文

OutOfMemonryException异常的原因

更多 时间:2014-1-13 类别:编程学习 浏览量:2425

OutOfMemonryException异常的原因

OutOfMemonryException异常的原因

OutOfMemonryException异常通常由以下因素造成:


1、将大型数据集读入内存中。


2、创建过多的缓存条目。


3、上载或下载大文件。


4、在分析文件时过多地使用正则表达式或字符串。


5、过多的视图状态。
 

6、会话状态中有过多的数据或者会话过多。

7、程序中存在死循环,或者循环次数过大。

8、对 COM 对象调用一个方法,并且该方法返回包含安全数组(大小不固定的数组)的用户定义类型时,可能引发此异常,并附带一条额外的消息“存储空间不足,无法完成此操作”。这是因为 .NET Framework 无法封送带有安全数组类型的结构字段。

9、程序中用完的对象没有及时释放掉。

 

常见的处理OutOfMemonryException的方法

 

1) 在硬件的配置上

出现该问题的原因我想很多人已经知道了,那就是IIS对于内存的管理存在一些限制,普遍的认识是800M的线程内存使用上限,不管是w3wp还是aspnet_wp,这个限制对ASP.NET应用服务器的机器配置而言其意义是很明显的,超过2G的内存对于单纯的Web服务器而言作用是很微小的,所以在Web服务器的配置上可在CPU的数量方面多考虑。

 

2) IIS配置上的方案

对于IIS6.0及以上可以在应用程序池的配置上设置自动回收工作线程的时间,一般都会设在晚上访问比较少的时间段。

 

3) 在.NET Framework的配置上

修改machine.config配置文件中的配置节<processModel>的属性“memoryLimit”,这个属性的值默认为“60”,是一个百分比数据,我们需要按照服务器实际的内存数,再根据800M的上限来设置这个值,那么在达到这个阀值时IIS会自动回收进程

 

4) 在Web应用程序的开发中

必须尽可能的减少对内存使用的浪费,及时释放资源:

1、通过代码主动调用Dispose方法进行资源释放

2、对于实体类尽可能复用,不做多余的声明和创建

3、减少Session的使用,缩短Session的有效期,尤其对于大数据对象尽量不要存储在Session中。

 

5) 一个比较通用的办法

在Web应用程序的基类中通过try{}catch{}来主动捕捉OutOfMemoryException异常,发现该异常后直接调用GC.Collect()进行强制垃圾回收。