遇到OutOfMemoryException异常了
|
asp.net做的售后服务系统运行了快1年了,昨天在做全年数据导出的时候出现OutOfMemoryException异常,数据量大约50M。50M应该不是很大,放在数据库里也就几万条(表字段很多)。IIS6的应用程序池的设置是默认的。不知道为什么这样,本机测试的时候是没有这个问题的。估计问题的原因在于:1。程序中内存控制问题;2。服务器内存回收的问题。据说IIS6最多能用800M的内存,如果IIS设置的内存超过800M就可能出现OutOfMemoryException错误。IIS的设置也是比较重要的,可以在早上设置内存回收,把内存回收的周期设置为600分钟。 程序内一定要注意控制内存,虽然C#的程序基本都是托管的,由垃圾回收器来收内存,但是我们一定要注意多用using,数据读取用datareader。不要用dataset做大数据量的处理,合理利用分页。看了下系统的代码,有很多地方都需要优化,唉,没那么多时间搞,郁闷。以后写程序要多注意。 对于这个异常,貌似没有什么好的解决办法,只是在写程序的时候多注意。根治的办法只能是对程序动手术了。在Application_Error里可以捕获此异常。 ================Application_Error里处理异常的例子 //初始化异常 //输出 //输出 //返回 //异常为内存溢出 //输出 //由SQLServer返回的警告或或错误引发的异常 //输出 //返回 //严重程度处理 [数据库服务器正在关闭] //输出 //返回 //严重程度处理 [系统正在登陆数据库服务器] //输出 //返回 //事件信息处理 //输出 //返回 //忽略框架异常 //写入异常 |
ASP.NET中OutOfMemoryException异常的处理方案
相信做ASP.NET中大型Web应用的人都碰到过OutOfMemoryException这个异常,对于这个问题我研究了很久,在微软的技术文档上也了解过此问题出现的原因,说实话,到目前我仍然没有完美的解决方案,这里只是把我处理该问题的一些经验提出来和大家一起分享,尽可能的避免该问题的发生。
1) 首先,在硬件的配置上,出现该问题的原因我想很多人已经知道了,那就是IIS对于内存的管理存在一些限制,普遍的认识是800M的线程内存使用上限(通过我的一些客户实践证明的确如此,甚至更低...),不管是w3wp还是aspnet_wp,这个限制对ASP.NET应用服务器的机器配置而言其意义是很明显的,超过2G的内存对于单纯的Web服务器而言作用是很微小的,所以在Web服务器的配置上可在CPU的数量方面多考虑。
2) IIS配置上的方案,IIS5.0可安装一个IIS5Recycle程序,该程序采用服务的形式来回收工作进程,安装说明:http://support.microsoft.com/?id=322350,对于IIS6.0可以在应用程序池的配置上设置自动回收工作线程的时间,我一般都会设在凌晨2点:)
3) 在.NET Framework的配置上,修改machine.config配置文件中的配置节<processModel>的属性“memoryLimit”,这个属性的值默认为“60”,是一个百分比数据,我们需要按照服务器实际的内存数,再根据800M的上限来设置这个值,那么在达到这个阀值时IIS会自动回收进程
4) 在Web应用程序的开发中,必须尽可能的减少对内存使用的浪费,及时释放资源,我想说明的有3点:1、通过代码主动调用Dispose方法进行资源释放,2、对于实体类尽可能复用,不做多余的声明和创建,3、减少Session的使用,缩短Session的有效期,尤其对于大数据对象尽量不要存储在Session中
5) 一个比较通用的办法,在Web应用程序的基类中通过try{}catch{}来主动捕捉OutOfMemoryException异常,发现该异常后直接调用GC.Collect()进行强制垃圾回收。
最后,有很多朋友提到32位系统对于大内存使用方面可以打开3G模式,这个本身没有什么问题,只是根据个人经验,其对单纯Web应用程序的帮助不大,如果Web服务器还有更多的用途当然也建议采用此模式.
希望对大家处理此问题有帮助.
===========
ASP.NET中的OutOfMemoryException
在博客园看到了一位园友写的文章《如何处理OutOfMemoryException异常?》,于是想和大家交流一下ASP.NET中出现OutOfMemoryException的问题。
实际上,在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的发生,原因可能是多样而复杂的,比如内存回收操作可能耗时太多等等。开发人员要注意的,就是在代码中时刻牢记不要无谓的使用和浪费内存。:)
遇到OutOfMemoryException异常了的更多相关文章
- CSharpFlink分布式实时计算,OutOfMemoryException异常,你意想不到的原因。
目录 一.测试过程及问题 二.问题排查及分析过程 三.问题分析及解决过程 四.问题解决初步结果 一.测试过程及问题 从昨天15点左右开始测试,1个主节点,10个计算节点,1000个数据点,每个数据点3 ...
- OutOfMemoryException异常解析
一.概述 在国庆休假快结束的最后一天晚上接到了部门老大的电话,某省的服务会出现崩溃问题.需要赶紧修复,没错这次的主角依旧是上次的"远古项目"没有办法同事都在休假没有人能帮忙开电脑远 ...
- [.Net]System.OutOfMemoryException异常
1. 一个异常情景 加载15000条等高线,平均每条线有400个点到三维球上,等待时间太长.而且可能会报内存异常. 2. 不错的分析 http://wenku.baidu.com/view/14471 ...
- 操作XmlDocument时,出现"System.OutOfMemoryException"异常,如何解决加载大数据的情况?
System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.at System.St ...
- [SQL SERVER] - 还原数据库备份(SQL脚本),抛出 "System.OutOfMemoryException" 异常之解决
背景 在 Microsoft SQL Server 2016 的查询窗体中,直接还原备份数据库的 SQL 脚本(99MB),抛出 Cannot execute script 异常: 原因 相关资料说: ...
- 多线程引发OutOfMemoryException
现象: 内存是绝对没有问题的,3g内存,发生异常时,任务管理器里显示,可用内存还有1G多!不知道什么原因! int i=0; while ((i++) < 2000) { try { Threa ...
- .Net 内存溢出(System.OutOfMemoryException)的常见情况和处理方式总结
.Net 内存溢出(System.OutOfMemoryException)的常见情况和处理方式总结 在什么情况下会出现OutOfMemonryException呢? 在我们试图新建一个对象时,而垃圾 ...
- System.OutOfMemoryException: 内存不足。(转)
主要是网站生成水印图片的时候遇到的 原文地址:http://www.cnblogs.com/longgel/archive/2010/03/24/1693776.html 今天调试asp.net 程序 ...
- w3wp异常
相信做ASP.NET中大型Web应用的人都碰到过OutOfMemoryException这个异常,对于这个问题我研究了很久,在微软的技术文档上也了解过此问题出现的原因,说实话,到目前我仍然没有完美的解 ...
随机推荐
- POJ 2750 Potted Flower (单点改动求线段树上最大子序列和)
题目大意: 在一个序列上每次改动一个值,然后求出它的最大的子序列和. 思路分析: 首先我们不考虑不成环的问题.那就是直接求每一个区间的最大值就好了. 可是此处成环,那么看一下以下例子. 5 1 -2 ...
- 浅谈LZSS与游戏图片破解
业余游戏制作者最头疼的就是没有美工的支持了.很多业余游戏制作所使用的图片都是来自于网上的很有限的一些图片资源,然而这些图片并不能完整配套,所以业余游戏的画面往往显得单调或者搭配不协调(使用多个不属 ...
- ajax异步请求,session失效处理
后台拦截器代码: // 判断是否是AJAX请求 if (isAjaxRequest(request)) { log.info("AjaxRequest请求"); ActionCon ...
- 最短作业优先(SJF)
1. 最短作业优先: 最短作业优先(SJF)是一种调度任务请求的调度策略.每个任务请求包含有请求时间(即向系统提交的请求的时间)和持续时间(即完成任务所需时间). 当前任务完成后,SJF策略会选择最短 ...
- windows 2003 群集
http://www.tudou.com/programs/view/-UZoSIuUvXs/
- atitit.自动生成数据库结构脚本,或者更换数据库,基于hibernate4
atitit.自动生成数据库结构脚本,或者更换数据库,基于hibernate4 目前近况:: 更换数据库,但是是使用spring集成的. <!-- hibernate配置文件路径 --> ...
- Atitit.部分错误 设计模式,异常处理框架atiPartErr 的总结
Atitit.部分错误 设计模式,异常处理框架atiPartErr 的总结 1. 流程图 1 2. Java 类关系结构图片 1 3. 错误信息结构 1 4. 调用 2 4.1. 收集错误信息 3 4 ...
- iOS开发通过AFNetworking上传图片到服务器
iOS开发通过AFNetworking上传图片到服务器 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager. ...
- Linksys WRT54G2 V1刷ddwrt注意事项
关于DD-WRT和TOMATO下的应用就不多说了,反正其他能刷DD-WRT.TOMATO的路由器会有的功能,这台机器也都有,不过此机器刷TOMATO一定要刷ND版本的,因为5354的CPU是属于比较新 ...
- 文件操作之格式化IO
其实在我使用最多的文件操作中,还是喜欢格式化IO控制的方式,简单方便易理解. #include <stdio.h> #include<stdlib.h> int main() ...