2011-01-15 6 views
1

ich habe ein Problem in Wörterbuch Entsorgung KlasseProblem Entsorgung Klasse in Wörterbuch es ist immer noch in den Speicherhaufen obwohl GC.Collect mit

dies ist mein Code

private Dictionary<string, MyProcessor> Processors = new Dictionary<string, MyProcessor>(); 

     private void button1_Click(object sender, EventArgs e) 
     { 
      if (!Processors.ContainsKey(textBox1.Text)) 
      { 
       Processors.Add(textBox1.Text, new MyProcessor()); 
      } 

     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      MyProcessor currnt_processor = Processors[textBox2.Text]; 
      Processors.Remove(textBox2.Text); 
      currnt_processor.Dispose(); 
      currnt_processor = null; 
      GC.Collect(); 
      GC.WaitForFullGCComplete(); 
     } 








    public class MyProcessor: IDisposable 
    { 

     private bool isDisposed = false; 

     string x = ""; 

     public MyProcessor() 
     { 
      for (int i = 0; i < 20000; i++) 
      { 
      //this line only to increase the memory usage to know if the class is dispose or not 
       x = x + "gggggggggggg";  

      } 

     } 

     public void Dispose() 
     { 
      x=null; 
      this.Dispose(true); 
      GC.SuppressFinalize(this); 
     } 

     public void Dispose(bool disposing) 
     { 
      if (!this.isDisposed) 
      { 
       isDisposed = true; 
       this.Dispose(); 
      } 
     } 

     ~MyProcessor()  
     { 
      Dispose(false); 
     } 


    } 

i "ANTS Memory Profiler" verwenden überwachen nur Heap-Speicher

die Entsorgung der Arbeit, wenn ich alle Schlüssel aus Wörterbuch entfernen

wie kann ich die Klasse von Heap-Speicher zu zerstören?

dies ein Video-Link für das Problem

http://www.youtube.com/watch?v=ePorlksv2QY

Dank im Voraus

+3

Warum rufen Sie 'this.Dispose' im Konstruktor an? –

+4

Dieser Code macht keinen Sinn. Was hat die Entsorgung damit zu tun? Kannst du erklären, warum du denkst, dass eine dispose-Methode einen Unterschied für das * Memory * -Management darstellt? Sind Sie unter dem falschen Glauben, dass Dispose für die Verwaltung von Speicher ist? –

+0

dies eine Videoverbindung für das Problem http://www.youtube.com/watch?v=ePorlksv2QY – bebo

Antwort

5

Ich denke, man Geister sehen - denken Sie daran, dass die .NET Garbage Collection ein Generations-Speicherbereinigungs basiert auf Gedächtnisdruck. Wenn es keinen Speicherdruck gibt, werden Ihre Ressourcen nicht als Müll gesammelt. Auch GC.Collect() zu nennen ist nur eine schlechte Idee, ich hoffe, Sie machen das nur für Ihre Profiling-Tests.

Nebenbei, welche Ressourcen genau sind Sie in Ihrer Dispose Methode entsorgen? Sieht nicht so aus als würdest du einen brauchen.

In der Implementierung haben Sie keinen einzigen Dispose() Methodenaufruf zur Verfügung gestellt und der Finalizer ~MyProcessor() wird überhaupt nicht benötigt.

+0

hhhhhhh dies ein Video-Link für diese Geister http://www.youtube.com/watch?v= ePorlksv2QY – bebo

1

Ich denke, dass Sie eine GC.WaitForFullGCComplete() aufrufen möchten; als GC.Collect(); startet einfach den GC.

Es ist möglich, ein Referenzleck zu haben (dh Sie behalten versehentlich eine ganze Ladung von Referenzen auf Objekte in einer Liste, um deren Erfassung zu verhindern). Ich bezweifle, dass das Wörterbuch ein solches "Leck" hat, da es eine so weit verbreitete Klasse ist, dass es ein bekanntes Problem wäre. Wenn Sie Probleme mit Ihrem Code haben, liegt das Problem höchstwahrscheinlich an einem anderen Ort in Ihrem Code.

Wenn dies nicht, dass Sie tatsächlich Probleme zu verursachen, es entlassen, nehmen Sie Ihr Handtuch und nicht in Panik geraten, hat die GC Arbeit :)

+0

nicht funktioniert das ein Video-Link für das Problem http://www.youtube.com/watch?v=ePorlksv2QY – bebo

+1

Wenn Sie ein echtes Problem haben, ist es wahrscheinlich woanders in Ihrem Code.Wenn Sie kein wirkliches Problem haben und nur versuchen, GC zu testen, dann viel Glück damit. Der GC funktioniert. – Neil

+0

Ich habe ein Problem, nicht für den Test, ich weiß, dass GC ist Arbeit, aber mein sein gibt es ein Problem mit Dictionary oder etwas, was ich nicht weiß – bebo

0

Sie entfernen Artikel mit einem Namen, aber unter einem anderen Namen Entsorgung Elemente aus Wörterbuch. So wird das Objekt, auf das verwiesen wird, immer noch aus dem Wörterbuch referenziert (Processors.Remove (textBox2.Text); während current = dict [textBox1.Text]).

Notieren Sie sich Eric's Kommentar - Dispose macht das Objekt nicht bereit für die Garbage Collection, wenn es Referenzen hat, wird es immer noch im Speicher sein.

+0

Dies ist ein Video-Link für das Problem http://www.youtube.com/watch?v=ePorlksv2QY – bebo

Verwandte Themen