排除程序代码的问题
之所以发生这个问题,是因为多处理器(或多核心)计算机上的 .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