5

ASP.Net 4.0 Web サイトで毎日 OutOfMemoryExceptions が発生しています。問題の 1 つは LOH の断片化であると思われるため、より効率的にメモリを割り当てるコードの変更を検討しています。

たとえば、ブラウザーに返したい大きな文字列 (2 MB) を生成しています。データのページングは​​オプションではありません。

次のほうが効率的ですか?

  1. Response.Write(bigString)StringBuilder で文字列を作成してから、またはを 1 回呼び出します。
  2. を繰り返し呼び出して文字列を断片的に書き込む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 の間で変化します。問題は、物理メモリが不足していることではないと思います。

4

2 に答える 2

1

実装を知らなければ、私の答えは私が望むよりも少し役に立たないかもしれません. でも、あえてやってみます。

私だったら、次の 2 つの戦術を活用します。

  1. ハードディスク容量を利用して、サーバーのキャッシュ ディレクトリに保存されているテキスト ファイルに書き込みます (Web サーバーが 1 つだけの場合)。
  2. 古い学校の Server.Execute("~/filename.txt"); を使用します。をクリックして、テキスト ファイルの内容をページに吐き出します。
于 2014-06-10T03:48:11.740 に答える