ASPを解決する.NETのシステムOutOfMemoryExceptionの問題

7417 ワード

この2日间、マイクロソフト技术菁英学院で开かれた「ASP.NETアプリケーション探错実戦专班」に参加しました.わずか2日でしたが、学んだことは本当に多くの利益を得ました.TerryとLouisはWin 32 Debuggingに対して感謝しています.NET Debuggingの精巧な解析!後で時間があればASPについてもっと分かち合うことができます.NET探错関连のテクニックと心得、今日はまずASPについて分かち合いたいと思います.NETではSystemについてOutOfMemoryExceptionの問題と解決方法.
以前にもシステムが発生するホストがいましたOutOfMemoryExceptionの間違いは、プログラムがうまく書けないせいかもしれないと思っていたのですが、いくら調べても問題がどこにあるのかよくわからず、流れが大きくなるとこの例外的な状況になる可能性があるので、まったく手が回らなくて、今回授業に行って知ったのもそのためかもしれません.NETのメモリ回収行程(GC)による問題.
この問題が発生したのは、マルチプロセッサ(またはマルチコア)コンピュータ上のためである.NET CLRのGarbage Collection(GC)メカニズムのプリセットは、Server Mode(サーバーモード)を使用して動作しています.言い換えれば、「CPUごとに独立したGCメモリ空間(スタック、Heap)」があるので、GCメモリ空間が500 MBでCPUが4個あると、2 GBのメモリが消費され、Systemが発生します.OutOfMemoryException例外状況!
この問題を解決するには、GCをワークステーションモードに設定することで、メモリの使用を節約するために、ホスト全体で同じGC Heapを共有することができます.プリセットGCをWorkstation Modeに変更するには%WINDIR%/Microsoftを変更する必要があります.NET/Framework/v2.0.50727/Aspnet.configファイル(.NET 1.1であれば%WINDIR%/Microsoft.NET/Framework/v 1.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>

を追加する必要があります.
<?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 64 bitなど)を使用する場合は、このような調整はあまり必要ありませんが、メモリは十分に多くなければなりません.そうしないと、ページの状況が多すぎるとASPが低下します.NETアプリケーションの実行効率!
それ以外に、正式(Production)環境におけるASP.NETアプリは必ずwebで.configで開発時期に設定されたdebugとtraceをオフにすると、メモリに余分な負担がかかりません.なぜならASP.NETアプリケーションはdebug modeを有効にすると、すべてのSymbolファイル(*.pdb)がメモリにロードされ、多くのメモリを消費するだけでなく、実行効率も低下します.詳細はMicrosoft Knowledge Base:Quick things to check when you experience high memory levels in ASP.NET
 
原文:http://blog.miniasp.com/post/2008/05/Solve-ASPNET-SystemOutOfMemoryException-problem.aspx
 
--------------
どのような場合にOutOfMemonryExceptionが発生しますか?引用<.Netフレームワークプログラム設計改訂版>>では、オブジェクトを新規作成しようとすると、ゴミ収集器が使用可能なメモリが見つからない場合に投げ出されます.この場合、私たちはこの異常をキャプチャすることができます.もう1つの場合、CLRがメモリを必要としている場合、システムは提供できません.この異常も投げ出されますが、この場合、私たちのアプリケーションはこのエラーをキャプチャできません.
<<.Netフレームワークプログラム設計改訂版>>OutOfMemoryException異常を開発者がほとんど考えていない隠れた仮説として挙げています.つまり、多くの開発者はこの異常の発生の可能性を全く考えずに処理しています.少なくとも私が開発したシステムではこの異常を専門に考えていません.
 
実際、ASP.NET Webサーバ上、ASP.NETで使用できるメモリは、通常、すべてのメモリ数に等しくありません.マシーンでconfigプロファイルでは、コンフィギュレーションセクションに「memoryLimit」という属性があります.この属性の値はパーセンテージ値で、デフォルトは「60」で、ASPが指定されています.NETプロセス(タスクマネージャではASP.NETのプロセスが見られ、IIS 5ではaspnet_wp、IIS 6ではw 3 wp)はすべての物理メモリの60%を使用できます.ASP.NETが使用するメモリ量がこの限度額を超えると、IISは自動回収(recycle)プロセスを開始します.すなわち、Httpリクエストに対応する新しいプロセスを作成し、古いプロセスで使用されたメモリを回収します.
マイクロソフトが推奨するASP.NETプロセスのメモリ消費量は60%以下であり、計算された実際の値はt=「on」>800 Mを超えないことが望ましい.つまり、t="on">4 Gメモリのサーバでは、"memoryLimit"属性を"20"に設定することが望ましい.IISが適時にプロセス回収を行うように適切な回収閾値を設定することは,サーバ全体の安定した動作を保証するためにOutOfMemoryExceptionを回避する上で非常に重要である.IIS 6において、ASP.NETプロセスの回収しきい値は、コンフィギュレーション・セクションの「memoryLimit」プロパティではなく、IISマネージャのアプリケーション・プールコンフィギュレーションの設定で決まります.しかし、これらの構成が正しく設定されていても、OutOfMemoryExceptionの発生を完全に回避することは保証されません.メモリ回収操作に時間がかかるなど、多様で複雑な原因がある可能性があります.開発者が注意しなければならないのは、コードの中で無駄な使用やメモリの浪費をしないことを常に覚えておくことです.:)大きなメモリを持つサーバがある場合、Win 32オペレーティングシステムでプロセスの最高使用量t="on">2 Gメモリの制限が憂鬱な場合、オプションの解決方法は2つあります:1、/3 GBモードでコンピュータを起動し、方法参加文後のリンク2、Windows Server 2003 64 bits Editionを使用
 
異常に関するトラブルシューティング:System.OutOfMemoryExceptionメモリの割り当てに失敗すると、OutOfMemoryException異常が発生します.関連するプロンプト配列を作成する場合は、そのサイズが正しいことを確認します.内部用途と新しい管理オブジェクトに十分なメモリがあることを確認します.もしあなたがいるなら.NET Compact Frameworkでプログラミングを行い、内部用途や新しい管理オブジェクトに十分なメモリがない場合、共通言語実行ライブラリでこの異常が発生します.この異常を回避するには、64 KB以上のメモリを消費する大きなメソッドを記述しないでください.メモ管理メモリの使用量が多すぎるのは、通常、1大規模なデータセットをメモリに読み込む要因です.2キャッシュ・エントリを作成しすぎます.3大きなファイルをアップロードまたはダウンロードします.4ファイルを解析するときに正規表現または文字列を過度に使用します.5ビューの状態が多すぎます.6セッションステータスにデータが多すぎたり、セッションが多すぎたりします.COMオブジェクトにメソッドを呼び出し、セキュリティ配列(サイズが固定されていない配列)を含むユーザー定義タイプを返すと、この例外が発生し、「ストレージ領域が不足し、この操作を完了できません」という追加のメッセージが表示されます.なぜならNET Frameworkでは、セキュアな配列タイプの構造フィールドを封入できません.
REF:
http://blog.csdn.net/limmo/archive/2007/01/20/1488329.aspx
http://hi.baidu.com/melovesmile/blog/item/f69efffd2309a085b901a0bb.html
http://hi.baidu.com/anwyo/blog/item/921e93132e3cf6d3f6039e75.html
http://www.cnblogs.com/kwklover/archive/2005/05/05/149787.html
 
原文:http://hi.baidu.com/jok607/blog/item/c59ff9f8e6515704d8f9fd60.html