消除System.OutOfMemoryException
- 博客分类:
- 技术杂绘
消除System.OutOfMemoryException
2010年11月29日
一,运行时错误
首先程序的异常,甚至错误是在所难免的,但当系统出现异常时,应该提供给用户一个友好的界面,并简单说明原因,对这个问题,我一般的解决办法是
这里可以不用配置
然后在HttpModule的Application_Error事件中检测所有Error,并跳转到指定友好页面。另外也可以在所有页面的基类的Page_Error事件中检测,并跳转到指定友好页面,ASP.NET forums提供的解决方案,我觉得已经很优秀了,博客堂的宝玉提供这方面的很好的介绍
二,OutOfMemoryException异常如何处理
在什么情况下会出现OutOfMemonryException呢?
引>的话: 在我们试图新建一个对象时,而垃圾收集器又找不到任何可用内存时被抛出,这种情况下我们是可以捕获该异常的,另一种情况是,CLR需要内存时,而却系统却不能提供,也会抛出该异常,但此时,我们的应用程序是不能捕获该错误的
>把OutOfMemoryException异常列为开发人员几乎从来不会考虑的隐含假设,也就是说,很多开发人员根本不考虑该异常发生的可能并做出处理,起码我在我开发的系统里并没有专门考虑这个异常
我现在考虑的问题是:
1,如果是新建对象找不到可用内存抛出该异常,那么在HttpModule的Application_Error事件能否捕获改错误?我的想法是,即使可以捕获,也是不能得到处理的,因为自定义的异常处理仍然需要内存来运行,所以无论能否捕获,都不能做友好处理
2,如果CLR找不到需要的内存情况下抛出改异常,那就更不能处理了
也就是说,几乎在任何情况下,我们都无法在系统出现OutOfMemoryException异常提供友好界面?
服务器配置方面
1. 安装.NET Framework 1.1 Service Pack 1补丁部分解决了一些内存泄漏的问题,下载地址为:http://www.microsoft.com/downloads/details.aspx?di splaylang=en&FamilyID=a8f5654f-088e-40b2-bbdb-a8335 3618b38
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
代码编写方面的注意问题
1.System.Drawing方面的类使用问题
System.Drawing用到了很多系统的资源和非托管代码,所以使用的时候要特别小心,注意内存泄漏(Memory Leak)例如:BitMap.MakeTransparent方法的使用问题:http://www.dotnet247.com/247reference/msgs/40/2025 28.aspx
2.new byte[]问题
处理流的时候常常会用到new一个大的byte数组。但在多用户情况下会消耗大量的内存。正确的做法应该是定义一个比较小的byte数组做为缓存,然后循环使用。如在我们的程序中,有些地方使用不当,当图片(或附件)过大或过多的时候, new byte[length]就有可能消耗过多的内存。
3. 避免使用大对象数组或小对象大数组
编程时同样要重视效率问题(包括内存占用问题)。
4.Com接口调用是要注意释放对象。
posted on 2005-01-25 13:37 Chainet
事件类型:错误
事件来源:Application
事件种类:无
事件 ID:0
日期:2005-11-19
事件:15:40:49
用户:N/A
计算机:WEBHOST1
描述:事件 ID ( 0 )的描述(在资源( Application )中)无法找到。本地计算机可能没有必要的注册信息或消息 DLL 文件来从远程计算机显示消息。您可能可以使用 /AUXSOURCE= 标识来检索词描述;查看帮助和支持以了解详细信息。下列信息是事件的一部分: System.OutOfMemoryException: 发生类型为 System.OutOfMemoryException 的异常。
http://blog.joycode.com/kaneboy/archive/2005/05/07 /50409.aspx
ASP.NET中的OutOfMemoryException
在博客园看到了一位园友写的文章《如何处理OutOfMemoryException异常?》,于是想和大家交流一下ASP.NET中出现OutOfMemoryException的问题。
实际上,在ASP.NET Web服务器上,ASP.NET所能够用到的内存,通常不会等同于所有的内存数量。在machine.config配置文件中,配置节中有一个属性"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的发生,原因可能是多样而复杂的,比如内存回收操作可能耗时太多等等。开发人员要注意的,就是在代码中时刻牢记不要无谓的使用和浪费内存。:)
【转】http://community.icburner.com/blogs/webdev/archive /2009/03/18/system-outofmemoryexception.aspx
发表评论
-
转:构建可扩展的Java EE应用
2012-01-20 08:41 730转:构建可扩展的Java EE ... -
动态创建组件、用Sender实现代码重用、ActiveX控件的使用
2012-01-20 08:41 1330动态创建组件、用Sender ... -
设备驱动程序共性
2012-01-20 08:41 966设备驱动程序共性 2011 ... -
使用 libevent 和 libev 提高网络应用性能
2012-01-20 08:41 515使用 libevent 和 libev 提 ... -
温州人生意经
2012-01-19 13:47 490温州人生意经 2010年07月04日 “有市场的地方就有 ... -
林 伦 伦:关于海外潮学研究的几点看法和建议
2012-01-19 13:47 953林 伦 伦:关于海外潮学研究的几点看法和建议 2011年03 ... -
011-5-20越南平阳沉船惨案陈述
2012-01-19 13:47 785011-5-20越南平阳沉船惨案陈述 2011年05月30日 ... -
Windows系统的Regsvr32
2012-01-17 03:37 648Windows系统的Regsvr32 2011 ... -
修复工具类
2012-01-17 03:37 630修复工具类 2011年05月08日 ... -
as3面试题
2012-01-17 03:37 860as3面试题 2011年09月13日 ... -
电脑高手应用技巧荟萃(电脑知识二十六)
2012-01-17 03:37 444电脑高手应用技巧荟萃(电脑知识二十六) 2010年12月07 ... -
regsvr32用法集合
2012-01-17 03:36 519regsvr32用法集合 2011年12月02日 R&a ... -
八、出家与在家
2012-01-16 02:12 789八、出家与在家 2011年11月29日 佛教弟子分两种, ... -
打拳适宜接地气-----黄复元
2012-01-16 02:12 757打拳适宜接地气-----黄复元 2012年01月05日 ... -
硬币的装聋作哑、
2012-01-16 02:12 649硬币的装聋作哑、 2011 ... -
今生每一个你见到的人都是业力感召而来的
2012-01-16 02:12 1063今生每一个你见到的人 ... -
癌症自愈
2012-01-16 02:12 1030癌症自愈 2011年12月14日 ...
相关推荐
在什么情况下会出现OutOfMemonryException呢? 在我们试图新建一个对象时,而垃圾收集器又找不到任何可用内存时被抛出,这种情况下我们是可以捕获该 异常的; 另一种情况是,CLR需要内存时,而却系统却不能提供,也会抛出...
主要介绍了SQL Server出现System.OutOfMemoryException异常的解决方法,同时提供了微软官方的解决方案,需要的朋友可以参考下
1.StackOverFlowException (一般来说这个不是真的堆栈不够了,而是你的代码出现了无线递归),如果你用throw new StackOverFlowException 还是可以catch的2.OutOfMemoryException (好像只有 box newarr newobj 才会抛...
使用Spire.Pdf添加水印,提示“System.OutOfMemoryException”异常和“未将对象引用设置到对象的实例”
JPEGKIT将LIJPEG Turbo C 库桥接到Android中,并用一个易于使用的类来封装它。您当前可以:
You can now double-click the appstart.jar and your application is started, without hideous DOS windows, class-path headhaches or fears of the dreaded OutOfMemoryException. ...
7.3.7 OutOfMemoryException 187 7.3.8 ComException、SEHException及其他CLR异常 188 7.3.9 ExecutionEngineException 188 7.4 自定义异常的设计 188 7.5 异常与性能 190 7.5.1 Tester-Doer模式 190 ...
对于多线程,您需要考虑线程安全,并且它可能会意外崩溃(例如OutOfMemoryException)并且所有线程都中止。如果您使用 jvmpart 进行处理,则一个崩溃永远不会影响其他崩溃,所有 JVM 进程都是独立运行的,并且与它...
7.3.7 OutOfMemoryException 187 7.3.8 ComException、SEHException及其他CLR异常 188 7.3.9 ExecutionEngineException 188 7.4 自定义异常的设计 188 7.5 异常与性能 190 7.5.1 Tester-Doer模式 190 ...
Java 内存泄露 解决方案 outofmemoryException 从实践获取真理
需要从JVM OutOfMemoryException(OME)中恢复JVM具有-XX:OnOutOfMemoryError选项,该选项可让您在脚本因OME而死时运行。 这是如何使用它的一个例子。 startTest.sh启动一个Java程序,该Java程序在内存不足的情况下...
JanusGraph over HBase支持全局顶点和边缘...但是,请注意,所有这些顶点和/或边都将加载到内存中,这可能会导致OutOfMemoryException。使用JanusGraph和TinkerPop的Hadoop-Gremlin有效地遍历大型图中的所有顶点或边。
这种尝试的结果应该可以实现该存储实现的生产就绪使用,并处理内存处理的特定属性,例如不惜一切代价避免OutOfMemoryException并在垃圾回收上减轻负担。 当然,我们不能完全避免它们,但至少可以以某种方式控制它们...
产服务器宕机。从当时的日志情况来看请求操作失败,资源等待操作,,现实抛出内存溢出(OutOfMemoryException)异常
我无法帮助解决与“OutOfMemoryException”错误相关的任何事情。 我建议为每个工具使用提供的 powershell 脚本(.ps1 文件)(带有必要的个人编辑)。 默认情况下,脚本被设置为使用syncMode 0(同步),因此,...
我们在开发过程中曾经遇到过一个奇怪的问题:当软件加载了很多比较大规模的数据后,会偶尔出现OutOfMemoryException异常,但通过内存检查工具却发现还有很多可用内存。于是我们怀疑是可用内存总量充足,但却没有足够...