我對使用try/catch塊來捕獲OutOfMemoryException
的事實有點困惑。捕捉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");
我用於創建內存不足+ 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以及哪些對象仍然需要進一步執行?
向我們展示您的OutOfMemory()方法。我敢打賭,你沒有保留它分配的內存的引用,所以GC可以在它返回之後釋放它。 –
完成,你是對的 – GameScripting
是的,所以只要OutOfMemory()拋出,它分配的所有內存都可以被GC釋放。 –