Mi sono imbattuto in qualche curioso comportamento riguardo alla garbage collection in .Net.Criteri per l'attivazione della garbage collection in .Net
Il seguente programma genererà una OutOfMemoryException molto rapidamente (dopo meno di un secondo su una macchina a 32 bit, 2 GB). Il finalizzatore Foo non viene mai chiamato.
class Foo
{
Guid guid = Guid.NewGuid();
byte[] buffer = new byte[1000000];
static Random rand = new Random();
public Foo()
{
// Uncomment the following line and the program will run forever.
// rand.NextBytes(buffer);
}
~Foo()
{
// This finalizer is never called unless the rand.NextBytes
// line in the constructor is uncommented.
}
static public void Main(string args[])
{
for (; ;)
{
new Foo();
}
}
}
Se la linea non sia commentata rand.nextBytes, viene attivata all'infinito, e il finalizzatore Foo viene richiamato regolarmente. Perché?
La mia ipotesi migliore è che nel primo caso, CLR o Windows VMM sono pigri nell'allocare la memoria fisica. Il buffer non viene mai scritto, quindi la memoria fisica non viene mai utilizzata. Quando lo spazio di indirizzi si esaurisce, il sistema si arresta in modo anomalo. In quest'ultimo caso, il sistema esaurisce la memoria fisica prima di esaurire lo spazio degli indirizzi, il GC viene attivato e gli oggetti vengono raccolti.
Tuttavia, ecco la parte che non ottengo. Supponendo che la mia teoria sia corretta, perché il GC non si attiva quando lo spazio degli indirizzi è basso? Se la mia teoria non è corretta, qual è la vera spiegazione?
I Non sono sicuro di avere la risposta giusta, ma mi metti su una pista interessante. Ho spento due Virtual PC in esecuzione (entrambi con 512 MB) e ho ottenuto il tuo comportamento. Quando ho caricato i VPC di backup, ho ottenuto il comportamento di arresto anomalo originale. –
Ci sono anche alcune funzioni interessanti nella classe 'GC' da verificare, ma ancora una volta, nel codice reale queste non dovrebbero mai essere usate. –
Con i VPC in esecuzione e Thread.Sleep (0) in posizione, il programma viene eseguito per sempre. Ora la domanda cambia ... Perché il GC non viene attivato automaticamente in caso di mancata allocazione? –