ASP.Net 4.0 Web サイトで毎日 OutOfMemoryExceptions が発生しています。問題の 1 つは LOH の断片化であると思われるため、より効率的にメモリを割り当てるコードの変更を検討しています。
たとえば、ブラウザーに返したい大きな文字列 (2 MB) を生成しています。データのページングはオプションではありません。
次のほうが効率的ですか?
Response.Write(bigString)
StringBuilder で文字列を作成してから、またはを 1 回呼び出します。- を繰り返し呼び出して文字列を断片的に書き込む
Response.Write(smallString)
オプション 1 に従うと、LOH のスペースを占有する 1 つの大きな文字列が得られ、それが Response オブジェクトの内部バッファにコピーされます。つまり、少なくとも一時的に LOH に 2 つの大きなブロックがあるようです。
オプション 2 に従うと、ガベージ コレクションを取得する多数の小さな文字列と、応答オブジェクトのバッファーの LOH 上の 1 つの大きなブロックだけを処理することになります。
したがって、オプション2の方が優れているようです。
私はこれを正しく理解していますか?
サーバーには 4 GB の RAM があり、Windows 2003 32 ビットを実行しています。これは、サーバー上で実行されている唯一のサイトです。したがって、各プロセスには 4 GB のアドレス空間がありますが、使用できるのは 2 GB だけです。仮想バイトが約 1.8Gb に達すると OOM エラーが発生し始め、サイトをリサイクルして約 24 時間問題を解決します。プライベート バイトは 500 ~ 800 MB の間で変化します。問題は、物理メモリが不足していることではないと思います。