【转载博客】System.OutOfMemoryException 的异常的错误解决方案

【转载博客】 blog.csdn.net/chensyabc/article/details/6042042

一,运行时错误

首先程序的异常,甚至错误是在所难免的,但当系统出现异常时,应该提供给用户一个友好的界面,并简单说明原因,对这个问题,我一般的解决办法是
<customErrors mode="Off" /> 这里可以不用配置
然后在HttpModule的Application_Error事件中检测所有Error,并跳转到指定友好页面。另外也可以在所有页面的基类的Page_Error事件中检测,并跳转到指定友好页面,ASP.NET forums提供的解决方案,我觉得已经很优秀了,博客堂的宝玉提供这方面的很好的介绍


 


二,OutOfMemoryException异常如何处理
在什么情况下会出现OutOfMemonryException呢?


引<<.net框架程序设计修订版>>的话: 在我们试图新建一个对象时,而垃圾收集器又找不到任何可用内存时被抛出,这种情况下我们是可以捕获该异常的,另一种情况是,CLR需要内存时,而却系统却不能提供,也会抛出该异常,但此时,我们的应用程序是不能捕获该错误的


<<.net框架程序设计修订版>>把OutOfMemoryException异常列为开发人员几乎从来不会考虑的隐含假设,也就是说,很多开发人员根本不考虑该异常发生的可能并做出处理,起码我在我开发的系统里并没有专门考虑这个异常


我现在考虑的问题是:
1,如果是新建对象找不到可用内存抛出该异常,那么在HttpModule的Application_Error事件能否捕获改错误?我的想法是,即使可以捕获,也是不能得到处理的,因为自定义的异常处理仍然需要内存来运行,所以无论能否捕获,都不能做友好处理


2,如果CLR找不到需要的内存情况下抛出改异常,那就更不能处理了


也就是说,几乎在任何情况下,我们都无法在系统出现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




代码编写方面的注意问题
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接口调用是要注意释放对象。
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配置文件中,配置节<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的发生,原因可能是多样而复杂的,比如内存回收操作可能耗时太多等等。开发人员要注意的,就是在代码中时刻牢记不要无谓的使用和浪费内存。:)


 


 


【转】http://community.icburner.com/blogs/webdev/archive/2009/03/18/system-outofmemoryexception.aspx
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: NPOI是一个强大的.NET库,用于读取和写入Microsoft Office文件,如Excel、Word和PowerPoint。在使用NPOI的过程中,有时会遇到System.OutOfMemoryException(内存不足)的异常。 System.OutOfMemoryException是.NET框架中的一种异常,它表示当前系统的可用内存不足,无法分配和处理所需的内存,导致内存溢出。这个异常通常与大数据量的文件或处理大型文件相关。 当使用NPOI处理大型Excel文件时,可能会遇到System.OutOfMemoryException异常。这主要是因为Excel文件通常包含大量的数据,当尝试一次性加载整个文件到内存时,可能会超出计算机可用的内存限制。 为了解决这个问题,可以尝试以下几种方法: 1.使用逐行读取的方式处理Excel文件,而不是一次性加载全部数据到内存中。通过逐行读取,可以降低内存使用量,并逐步处理数据。 2.优化代码逻辑,减少不必要的内存使用。例如,在处理每行数据时,可以立即释放不再需要的资源,如关闭流或释放对象。 3.增加系统的可用内存。可以尝试增加计算机的物理内存或调整相关的系统配置,以提供更多的可用内存供NPOI使用。 4.分割大型Excel文件为多个较小的文件进行处理。将一个大的Excel文件拆分成多个小文件,分别处理,可以降低系统内存的压力。 总之,遇到NPOI System.OutOfMemoryException异常时,需要通过合理的代码逻辑和合适的资源管理来解决内存不足的问题,以确保能够成功处理大型Excel文件。 ### 回答2: System.OutOfMemoryException 是一种在使用 NPOI 库时可能会遇到的异常。这个异常通常发生在尝试加载或处理大型 Excel 文件时,程序在内存分配方面遇到了限制。 当使用 NPOI 进行 Excel 文件的读取或写入操作时,它会将文件内容加载到内存中进行处理。如果文件过大,可能会超出系统的内存限制,导致程序抛出 OutOfMemoryException 异常。 为了解决这个问题,可以考虑以下几种方法: 1. 内存优化:可以检查代码中是否有内存泄漏的问题。确保在完成操作后及时释放对象和资源,避免持有不必要的引用。合理使用 NPOI 提供的 API,避免一次性加载整个文件。 2. 分批处理:如果 Excel 文件太大无法一次性加载到内存中,可以考虑使用分批处理的方式。可以将大文件拆分为多个小文件进行处理,这样可以减少每次加载的数据量,降低内存占用。 3. 增加 JVM 内存限制:如果应用程序运行在 Java 虚拟机上,可以考虑增加 JVM 的内存限制。可以在启动应用程序时,通过设置 -Xmx 参数来增加最大堆内存限制。 4. 使用 SAX 解析器:NPOI 提供了 HSSFSheet 类和 XSSFWorkbook 类用于加载和处理 Excel 文件,这两个类会将文件内容一次性加载到内存中。如果遇到大型文件导致内存溢出的问题,可以考虑使用基于事件的 SAX 解析器,逐行解析 Excel 文件,避免一次性加载整个文件。 通过以上方法,我们可以优化内存使用,避免发生 NPOI System.OutOfMemoryException 异常。 ### 回答3: NPOI是一个用于操作Excel、Word和PowerPoint等文件格式的开源库。当使用NPOI进行一些大量数据操作时,有时会遇到System.OutOfMemoryException异常。 System.OutOfMemoryException表示系统已经没有足够的内存来分配所需的对象,这可能是由于内存不足或者内存碎片化导致的。当读取或写入大量数据时,NPOI可能需要分配大量的内存来加载或处理这些数据,从而导致内存不足的异常。 出现这个异常时,我们可以尝试以下几种解决方法: 1.增加系统的物理内存。通过增加计算机的内存容量,可以为NPOI提供更多的可用内存,从而减少出现内存不足的可能性。 2.优化内存使用。检查代码中是否有大量的无用对象或者不必要的资源占用,及时释放无用的对象和资源,以减少内存的占用。 3.分批处理数据。如果需要处理的数据量非常大,可以考虑将数据分成多个批次进行处理,每次处理一部分数据,并在处理完毕后及时释放相关资源,从而减少内存的压力。 4.使用SXSSFWorkbook。对于大量数据的导出操作,可以使用SXSSFWorkbook来替代XSSFWorkbook,SXSSFWorkbook可以将数据写入临时文件并进行缓存,从而减少对内存的需求。 总之,遇到NPOI System.OutOfMemoryException异常时,可以通过增加内存、优化内存使用、分批处理数据和使用SXSSFWorkbook等方法来解决该问题。根据具体情况选择合适的解决方法,从而避免出现内存不足的异常

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值