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();
}
它打印出OutOfMemoryException
10 次,然后由于StackOverflowException
无法处理而终止。
RAM 图在执行程序时如下所示:
我现在的问题是为什么我们能够赶上OutOfMemoryException
?捕捉到它之后,我们可以继续执行我们想要的任何代码。正如 RAM 图所证明的,有内存被释放。运行时如何知道它可以 GC 哪些对象以及进一步执行仍需要哪些对象?