OutOfMemoryException
try/catch ブロックを使用してキャッチできるという事実について、少し混乱しています。
次のコードがあるとします。
Console.WriteLine("Starting");
for (int i = 0; i < 10; i++)
{
try
{
OutOfMemory();
}
catch (Exception exception)
{
Console.WriteLine(exception.ToString());
}
}
try
{
StackOverflow();
}
catch (Exception exception)
{
Console.WriteLine(exception.ToString());
}
Console.WriteLine("Done");
OutOfMemory + StackOverflowException の作成に使用したメソッド:
public static void OutOfMemory()
{
List<byte[]> data = new List<byte[]>(1500);
while (true)
{
byte[] buffer = new byte[int.MaxValue / 2];
for (int i = 0; i < buffer.Length; i++)
{
buffer[i] = 255;
}
data.Add(buffer);
}
}
static void StackOverflow()
{
StackOverflow();
}
10回出力し、処理できないOutOfMemoryException
ために終了します。StackOverflowException
プログラムの実行中、RAM グラフは次のようになります。
私の質問は、なぜキャッチできるのOutOfMemoryException
ですか?それをキャッチした後、必要なコードを実行し続けることができます。RAM グラフで証明されているように、解放されたメモリがあります。ランタイムは、どのオブジェクトを GC できるか、さらに実行するためにまだ必要なオブジェクトをどのように認識しますか?