Garbage Collection in c#

zioProduct

Erfahrenes Mitglied
Hey Freaks look at me, Autogramme Vis à vis *sing*

Guten Morgen, ihr geekigen geeks :)

So da ich mein Projekt nun Fertig habe, bin ich gerade an Performance Optimierung,Kommentierung etc. Von meinen Java Zeiten kenn ich nocht, dass ich Neu instanzierte Objekte wieder auf null setzen musste, damit Sie auch nicht zu lange in meine Code rumtrudeln, und meine Memory-Performance auch nicht in das Unendliche schwingt :-( Bei c# bin ich mir jedoch nicht so sicher(bin halt immer noch n nichtsnütziger Anfänger :) ) und habs auch gar nicht gemacht, weiss auch nicht wiso :p. Nun die Frage, ist das hier das selbe Prinzip, oder ist das bei .NET nicht mehr nötig? (frwk 1.1)

Und noch ne kleine Anhang-Frage: Arbeitet einer von euch mit SourceSafe?

Normal kann ich ja Source-Infos einbinden indem ich zB:
Code:
$Archive:$
In meinen ModulKopf schreibe. Also c++ ist es auf jedenfall so. Muss ich bei c# noch irgend was anders machen? Denn momentan tut sich da gar nix :eek:

So, das sollte für die morgige Stund mit dem batzen Gold im Mund reichen :suspekt:

mfg
ziop
 
Garbage Collection unter C# sieht im Prinzip folgendermaßen aus:

Der GC wird meist dann angetriggert, wenn der Heap-Speicher aufgebraucht sprich voll ist, manuell gestartet wird, oder wenn ein anderes Programm mehr Speicher benötigt, als aktuell noch frei ist.

Der GC iteriert durch den Heap und markiert zuerst jedes Objekt als Garbage, also setzt es auf "zu verwerfen". Danach wird nochmals jedes Objekt rekursiv überprüft, ob Referenzen darauf zeigen - es also noch benutzt wird. Jedes Mal, wenn ein Objekt vom Garbage Collector besucht wird, wird es als erreichbar markiert. Nach diesem Durchlauf steht nun fest, welche Objekte erreichbar sind und welche nicht. Zyklische Referenzen (also Objekt A referenziert Objekt B, welches Objekt C referenziert, welches wiederum Objekt A referenziert) werden ebenfalls entsprechend behandelt.

Im nächsten Schritt wird der Managed Heap durchlaufen und dieser kompaktiert. Das bedeutet, dass Objekte, die verworfen werden können durch Objekte, die im Heap weiter oben gelagert sind überschrieben werden. Dadurch verkleinert sich der Heap und benötigte Objekte wandern weiter nach unten. Es entstehen also keine "Löcher" Heap (Fragmentierung). Dadurch müssen natürlich auch alle Referenzen vom GC geändert werden. Dies ist natürlich ein aufwändiges Unterfangen und aus diesem Grund sollte der GC manuell nur aufgerufen werden, wenn dies unbedingt notwendig ist.

Wann werden Objekte nicht mehr benötigt? Beispielsweise werden in einer Methode unterschiedliche Objekte instanziert. Wurde diese Methode durchlaufen, werden diese Objekte natürlich nicht mehr benötigt und werden beim nächsten Durchlauf des GC entsprechend behandelt. Sie müssen also nicht explizit auf null gestellt werden. Anders verhält es sich bei Objekten, die "expensive resources" (Dateien, Socket-Verbindungen, Ports, Daten Strukturen etc.) enthalten. Hier bietet .NET die object finalization an. Werden also Verbindungen etc. benutzt sollte eine Methode Finalize() vorhanden sein. Diese wird bei der Freigabe des Objektes aufgerufen und somit können verwendete Resourcen auch entsprechend behandelt bzw. tatsächlich freigegeben werden. Hier ist zu beachten, dass die Finalize()-Methode der Basisklasse auch aufgerufen wird. Weiters immer einen try-catch-Block darum ziehen.

Eine weitere Möglichkeit besteht durch das Dispose()-Pattern. Hier ist eine Methode Dispose() zu implementieren. Durch den Aufruf von Dispose werden alle teuren Resourcen entsprechend freigegeben - wie auch in der Finalize()-Methode muss hier der Code für die Freigabe der Ressourcen manuell eingetragen werden. Die Ressourcen werden durch diesen Aufruf sofort freigegeben - ausser man wartet auf den Garbage Collector.

Die schönere Variante besteht darin, das IDisposable()-Interface zu implementieren. Dadurch wird die Methode Dispose() vorgeschrieben und muss entsprechend implementiert werden.

Natürlich gäbe es an dieser Stelle noch mehr zu sagen, aber das sollte als kurzer Überblick durchaus reichen.
 
Jo, danke Norbert!

Ich lass den Thread noch offen, vielleicht weiss noch einer was zu meinem SourceSafe "Problem"

Schönen Tag vorerst einmal ;)
 
Zurück