Sono un po 'confuso sul fatto che possiamo semplicemente prendere uno OutOfMemoryException
usando un blocco try/catch.Come funziona il rilevamento di una OutOfMemoryException?
Dato il codice seguente:
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");
I metodi che ho usato per creare l'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();
}
Esso stampa i OutOfMemoryException
10 volte e quindi termina a causa della StackOverflowException
, che non può gestire
Il grafico RAM sembra che durante l'esecuzione del programma:
La mia domanda ora è il motivo per cui siamo in grado di catturare il OutOfMemoryException
? Dopo averlo preso, possiamo semplicemente eseguire qualsiasi codice che vogliamo. Come dimostrato dal grafico RAM, viene rilasciata la memoria. Come fa il runtime a sapere quali oggetti può GC e quali sono ancora necessari per ulteriori esecuzioni?
Mostraci il tuo metodo OutOfMemory(). Scommetto che non stai mantenendo un riferimento alla memoria che alloca, quindi il GC può rilasciarlo dopo che è tornato. –
completato, hai ragione – GameScripting
Sì, così come OutOfMemory() genera, tutta la memoria allocata può essere liberata dal GC. –