• 關於 ASP.NET 中System.OutOfMemoryException 的問題與解決方法


    關於 ASP.NET 中System.OutOfMemoryException 的問題與解決方法。

    我們之前也有台主機「偶而」會發生 System.OutOfMemoryException 的錯誤,可能是因為 .NET 的記憶體回收行程 (GC) 所造成的問題。

    之所以發生這個問題,是因為多處理器(或多核心)電腦上的 .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 長這樣:

    1 <?xml version="1.0" encoding="UTF-8" ?>
    2 <configuration>
    3     <runtime>
    4         <legacyUnhandledExceptionPolicy enabled="false" />
    5         <legacyImpersonationPolicy enabled="true"/>
    6         <alwaysFlowImpersonationPolicy enabled="false"/>
    7         <SymbolReadingPolicy enabled="1" />
    8     </runtime>
    9 </configuration>

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

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <configuration>
     3     <runtime>
     4         <gcServer enabled="false" />
     5         <legacyUnhandledExceptionPolicy enabled="false" />
     6         <legacyImpersonationPolicy enabled="true"/>
     7         <alwaysFlowImpersonationPolicy enabled="false"/>
     8         <SymbolReadingPolicy enabled="1" />
     9     </runtime>
    10 </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)都會被載入到記憶體中,不但會消耗不少記憶體,也會降低執行效能。詳情請見微軟知識庫:Quick things to check when you experience high memory levels in ASP.NET

  • 相关阅读:
    Java运行时数据区
    关于Java中的内存屏障
    Java中对象在内存中的大小、分配等问题
    【java基础】两个日期的比较大小的几种方法。
    报错信息: java.sql.SQLException: 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK
    linux 中文件按照时间倒序或者升序显示
    maven本地仓库存在为什么还要连接外网下载?
    【奇奇怪怪的代码问题】-springboot前后端时间不一致
    日常问题-使用maven jetty插件启动慢的一些解决方法
    Mybatis 框架下 SQL 注入攻击的 3 种方式
  • 原文地址:https://www.cnblogs.com/godwar/p/1684372.html
Copyright © 2020-2023  润新知