ho un test che prevede di passare ma il comportamento del collettore immondizia non è così Supposi:Garbage Collection dovrebbe rimuovere oggetto ma WeakReference.IsAlive ancora restituendo vero
[Test]
public void WeakReferenceTest2()
{
var obj = new object();
var wRef = new WeakReference(obj);
wRef.IsAlive.Should().BeTrue(); //passes
GC.Collect();
wRef.IsAlive.Should().BeTrue(); //passes
obj = null;
GC.Collect();
wRef.IsAlive.Should().BeFalse(); //fails
}
In questo esempio il obj
oggetto dovrebbe essere GC e quindi mi aspetterei che la proprietà WeakReference.IsAlive
restituisca false
.
Sembra che la variabile obj
sia stata dichiarata nello stesso ambito di GC.Collect
non sia stata raccolta. Se sposto la dichiarazione obj e l'inizializzazione al di fuori del metodo, il test passa.
Qualcuno ha documentazione tecnica di riferimento o spiegazione per questo comportamento?
Hai controllato il codice IL? Inoltre, si comporta allo stesso modo per le versioni di debug e di rilascio? –
La mia ipotesi iniziale è che le ottimizzazioni del compilatore/runtime/processore ti stiano mordendo. Si rendono conto che non stai leggendo mai 'obj', quindi è permesso riordinare le operazioni tra le altre chiamate di metodo. Prova ad aggiungere qualcosa come 'Console.WriteLine (obj == null)' solo per impedire al compilatore di farlo. – Servy
Questo esempio funziona correttamente sulla mia macchina. Sto usando 'Console.WriteLine' per registrare il parametro' IsAlive' invece di 'Should()' – JaredPar