0

これが取り引きです: 私の Web サーバーが起動すると、非常に小さなオブジェクト (1-2-3 int など) を持つ長い (20M の要素) 配列がいくつか作成されます。個々の配列の累積サイズは 2 GB を超えません (CLR の制限です。詳細については、以下のリンクを参照してください)。w3wp.exe のメモリ使用量は 2GB 近くまで増加します (それ以上になることはありません)。コードはAny CPUプラットフォーム モードでコンパイルされ、8 GB の RAM を搭載した Windows 7 x64 で実行されます。

リストの作成中に OutOfMemoryException をスローするのは一体何なのでしょうか? IIS または VS を介してプロセスをホストする場合、違いはありますか? これは PROD では発生していないように見えますが、私の開発マシンでは常にこれが発生しています。(すぐに再起動しようとします...)

これは関連している可能性がありますが、それほど大きなオブジェクトはないようです: .Net の非常に大きなコレクションにより、メモリ不足の例外が発生します

編集:IISまたはVSで実行することは違いがあります-プロセスがIISで開始されたときにそれが起こっていることを確認しないでください。VSデバッガの制限でしょうか?

4

3 に答える 3

0

おそらくメモリ割り当ては最適化されていません (つまり、小さなステップとサイズ変更で行われます)。これにより、ヒープがフラグメント化される可能性があり、「セミラージ」配列を格納するための十分な連続した空き領域がなくなります。

その割り当ては失敗し、この状況は定義上 OOM ですが、ヒープの断片が十分に利用可能である可能性があります。通常、linq を過度に使用すると、この問題が発生する可能性があります。ある時点で、遅延実行は魅力を失い、戦略的な場所で 1 つまたは 2 つの '.ToList()' を実行することで、多くのパフォーマンス/リソースを購入できます (私の経験では、多くの場合、生成プロセスの開始に近い場所で、大量のデータが到着します)。

于 2011-05-25T18:08:49.663 に答える
0

apppool のリサイクルしきい値が 2GB に設定されているかどうかを確認してください http://technet.microsoft.com/en-us/library/cc732519%28WS.10%29.aspx

于 2011-05-25T18:23:55.927 に答える