解决 ASP.NET 中 System.OutOfMemoryException 的问题

排除程序代码的问题

之所以发生这个问题,是因为多处理器(或多核心)计算机上的 .NET CLR 的 Garbage Collection (GC) 机制预设是使用 Server Mode (服务器模式) 在运作的,换句话说,就是「每一颗 CPU 都会有独立的 GC 内存空间(堆积, Heap)」,所以如果你的 GC 内存空间 用掉了 500MB 且你有 4 颗 CPU 的话,就等于耗费了 2GB 的内存,进而发生 System.OutOfMemoryException 例外状况!

要解决这个问题的方式就是将 GC 设定为 Workstation Mode (工作站模式),这样就可以整台主机共享同一个 GC Heap,以节省内存的使用。要将预设的 GC 修改成 Workstation Mode 必须要修改%WINDIR%\Microsoft.NET\Framework\v2.0.50727\Aspnet.config 档案 ( 如果是 .NET 1.1 要修改%WINDIR%\Microsoft.NET\Framework\v1.1.4322\Aspnet.config 档案 ):

预设的 Aspnet.config 长这样:

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <runtime>
        <legacyUnhandledExceptionPolicy enabled="false" />
        <legacyImpersonationPolicy enabled="true"/>
        <alwaysFlowImpersonationPolicy enabled="false"/>
        <SymbolReadingPolicy enabled="1" />
    </runtime>
</configuration>

需加上一行 <gcServer enabled="false"/> 如下:

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <runtime>
        <gcServer enabled="false" />
        <legacyUnhandledExceptionPolicy enabled="false" />
        <legacyImpersonationPolicy enabled="true"/>
        <alwaysFlowImpersonationPolicy enabled="false"/>
        <SymbolReadingPolicy enabled="1" />
    </runtime>
</configuration>

这样就设定完成了!

不过像这种出现 Out of Memory 的例外状况在 64 位的操作系统中几乎不会出现问题,所以如果你是用 64 位的操作系统(如:Windows Server 2003 64bit ) 的话,是不太需要做这样的调整的,但你的内存还是要够多才行,否则过多的分页状况还是会降低你 ASP.NET 应用程序的执行效能!

除了这点之外,在正式(Production)环境中的 ASP.NET 应用程序一定要在 web.config 中关闭开发时期设定的 debug与 trace,才不会对内存造成额外的负担。因为 ASP.NET 应用程序在启用 debug mode 的时候所有的 Symbol檔(*.pdb)都会被加载到内存中,不但会消耗不少内存,也会降低执行效能。详情请见微软知识库:http://support.microsoft.com/kb/893660/en-us

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值