我对于我们可以通过try/catch块来捕获OutOfMemoryException
有一点困惑。
给定以下代码:
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和StackOverflow异常的方法:
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图所证明的,有内存被释放。运行时如何知道哪些对象可以进行垃圾收集以及哪些对象仍需进一步执行?