2008-10-16 6 views
4
[TestMethod] 
public void Memory() 
{ 
    var wr = new WeakReference("aaabbb"); 
    Assert.IsTrue(wr.IsAlive); 
    GC.Collect(); 
    GC.Collect(); 
    GC.Collect(); 
    GC.Collect(); 
    GC.Collect(); 
    Assert.IsFalse(wr.IsAlive); //<-- fails here 
} 

C'est .NET 3.5 SP1
Quelqu'un peut-il me dire pourquoi ce test échoue?WeakReference Bug?

Modifier: Merci stusmith

Vous avez une référence à une chaîne, qui, depuis qu'il est une constante, est probablement interné (c.-à-pas dynamiquement alloués), et ne sera jamais recueilli .

C'était tout. Changement de première ligne à

var wr = new WeakReference(new object()); 

et le test passe :-)

Répondre

16

Je peux penser à deux raisons possibles du haut de ma tête:

  1. Vous êtes en cours d'exécution dans le débogage. Les références dans le débogage durent plus longtemps que dans la version, et peut-être plus longtemps que vous ne le pensez.
  2. Vous avez une référence à une chaîne qui, étant une constante, est probablement internée (c'est-à-dire non allouée dynamiquement) et ne sera jamais collectée.
+0

vous pouvez réellement vérifier le second en changeant la référence faible à cela. var wr = new WeakReference (nouveau Random(). Suivant (50) .ToString()); Vous verrez alors la passe d'essai – mhoward