2010-09-27 3 views
1

Je me casse la tête, mais je continue à chercher de la solution. J'ai couru ces code et analysé avec le profileur de mémoire de .NET. Cela m'a montré qu'une instance d'IntEntity [] n'est pas collectée. Mais je nettoie la liste et la rend nulle. Comment je peux faire cela pour ramasser les ordures? Est-ce que je fais quelque chose de mal ici?C# analyse de fuite de mémoire

Édition: J'ai essayé de définir b = null & en appelant GC.Collect (GC.MaxGeneration); Mais les mêmes résultats.
Edit2: Ajout d'images de NET Memory Profiler & ANTS Profileur de mémoire

S'il vous plaît aidez-moi.

Voici le code am utilise,

public class IntEntity 
{ 
    public int Value { get; set; } 
} 

public abstract class Base 
{ 
    protected List<IntEntity> numbers; 

    public Base() 
    { 
    } 

    public abstract void Populate(); 

    public int Sum() 
    { 
     numbers = new List<IntEntity>(); 

     Populate(); 

     int sum = 0; 
     foreach (IntEntity number in numbers) 
     { 
      sum += number.Value; 
     } 

     numbers.Clear(); 
     numbers = null; 

     return sum; 
    } 
} 

public class Child : Base 
{ 
    public override void Populate() 
    { 
     numbers.Add(new IntEntity() { Value = 10 }); 
     numbers.Add(new IntEntity() { Value = 20 }); 
     numbers.Add(new IntEntity() { Value = 30 }); 
     numbers.Add(new IntEntity() { Value = 40 }); 
    } 
} 

Base b = new Child(); 
MessageBox.Show(b.Sum().ToString()); 
b = null; 
GC.Collect(GC.MaxGeneration); 

alt text

alt text

+1

Puisque la classe 'Base' est ici abstraite, il doit y avoir un autre code requis pour le diagnostic, oui? –

+1

Il n'y a pas vraiment besoin d'appeler 'numbers.Clear()'. Définir simplement 'numbers = null' entraînera la collecte de la liste et le retrait des références' IntEntity' la prochaine fois que le garbage collector fera son travail. –

+1

Il doit y avoir quelque chose d'autre dans le code qui manque dans votre échantillon. –

Répondre

1

Comme Jim Mische et Steven Sudit ont indiqué qu'il se peut que le GC peut tout simplement pas être collecte parce que la RAM disponible pour l'exécution est supérieure à la quantité de mémoire requise par le programme

Vous pouvez ajouter GC. Collect() après avoir mis les nombres à null et il devrait probablement disparaître de votre profil.

Vous devez noter que vous ne devez généralement utiliser une récupération de place qu'à des fins de test.

+0

"Vous devriez noter que typiquement vous devriez seulement induire une Garbage Collection à des fins de test seulement" ... Pourquoi? – Jason

+1

Parce que Microsoft a passé beaucoup de temps à déterminer quand le GC fonctionne et il fait du bon travail. – Bryan