プロセスでメモリ不足の例外が発生するのは非常に簡単です。
大きなオブジェクト ヒープに収まらないほど小さなブロックにメモリを割り当てるループを作成するだけで (ただし、例外の原因となるブロックが多すぎない)、小さなファイルを開こうとすることができます。十分な連続メモリを割り当てることができず、巨大なファイルを必要とせずにファイルを開くと、OOM 例外が発生します。このようなもの...
List<byte[]> items = new List<byte[]>();
for (int i = 0; i < 10000; i++)
{
byte[] c = new byte[160000];
items.Add(c);
}
byte[] next = new byte[1000000000];
上記のコードをそのまま実行すると、最終行で OOM 例外が発生します。ただし、最初にループをコメントアウトすると、エラーなしで実行されます。ファイルを開くたびに失敗するようにするには、おそらくループを少し調整する必要がありますが、それは可能です。テストでファイルを開く呼び出しの前にループを実行するだけで、大量のメモリを使い果たし、開くことができなくなります。
また、オプションである場合は、/3GB スイッチの設定を検討することもできます。これは必ずしも正しい答えではなく、それに伴う欠点もありますが、仮想メモリ分割が 2GB/2GB から 1GB/3GB に変更され、プロセスがより多くの仮想アドレス空間にアクセスできるようになります。これにより、開くことができるファイルのサイズに少し余裕ができます。繰り返しますが、解決策としてこれを行う前に、これを行うことの欠点について読んで、状況に役立つ場合はそれが価値があることを確認する必要があります.
サーバーで有効にする方法は次のとおりです