Unterschied zwischen Destruktor und Garbage Collector

8

Ich möchte wissen, gibt es einen Unterschied zwischen Destruktor und Garbage Collector, Destruktor wird verwendet, um alle unbenutzten Objekte am Ende der Lebensdauer der Anwendung zu entsorgen, genauso ist die Verwendung des Garbage Collector, Garbage Collector kann manuell sein am Ende der Anwendung aufgerufen oder getan, gleich mit dem Destruktor, beide sind optional und verwenden, um das nicht referenzierte Objekt zu entsorgen, kann mir jemand zeigen, was der genaue Unterschied

ist     
Abbas 26.02.2012, 16:56
quelle

4 Antworten

7

Der Garbage Collector und der Finalizer / Destruktor sind intrinsisch verknüpft - die meisten Objekte benötigen jedoch keinen Destruktor (und haben keinen). Sie sind im verwalteten Code sehr selten und werden normalerweise verwendet, um sicherzustellen, dass nicht verwaltete Ressourcen freigegeben werden. Wenn ein Objekt einen Destruktor / Finalizer hat, ruft der Garbage Collector es ungefähr zur selben Zeit auf wie die Sammlung (vielleicht im nächsten Durchgang). Müllsammlung ist nicht-deterministisch - es passiert, wenn es passiert - oft in Bezug auf den Erinnerungsdruck.

Viel häufiger jedoch ist IDisposable. Dies ermöglicht ein besser vorhersagbares Muster für die Freigabe von Ressourcen jetzt (als wenn GC als nächstes passiert). Oft sind Klassen, die einen Finalizer haben, auch IDisposable, wobei die Dispose () - Implementierung den Destruktor deaktiviert (es wird nicht benötigt, wenn wir bereits bereinigt wurden). Beachten Sie, dass Dispose () nichts mit der Garbage Collection zu tun hat, aber über die "using" -Anweisung unterstützt wird.

IDisposable ist viel häufiger als Finalizer. Sie sind dafür verantwortlich, sicherzustellen, dass IDisposable entsorgt wird. Zusätzlicher Hinweis: Wenn Sie etwas entsorgen, wird das Objekt nicht eingesammelt. Das geschieht nur durch den GC in welchem ​​Zeitplan der GC auch wählt. Entsorgen Sie stattdessen zugehörige Ressourcen . Zum Beispiel möchten Sie nicht, dass eine Datei bis zur GC geöffnet bleibt. Mit Dispose () wird die Datei entsperrt (durch Freigeben der Betriebssystemdatei).

    
Marc Gravell 26.02.2012 17:03
quelle
6

Der Destruktor ist eine spezielle Elementfunktion, die aufgerufen wird, wenn ein Objekt zerstört wird. Es ist die letzte Methode, die von einer Klasse ausgeführt wird.

Der Garbage Collector ist Teil des Frameworks, verwaltet automatisch den Speicher und erfasst nicht-deterministisch nicht referenzierte Objekte, um Speicherlecks zu vermeiden.

    
Michele Spagnuolo 26.02.2012 16:59
quelle
3

Der Garbage Collector ist ein Teil der .NET-Umgebung, die Objekte verfolgt und sicherstellt, dass Objekte aus dem Speicher entfernt werden, wenn sie nicht mehr benötigt werden.

Ein Destruktor ist ein Teil eines Klassenentwurfs. Es ist das Gegenteil eines Konstruktors. Wenn Sie es deklarieren, ruft der GC es auf, wenn es ein Objekt zerstört.

Hier finden Sie die MSDN-Dokumentation.

    
Wouter de Kort 26.02.2012 16:59
quelle
0

Der Garbage Collector arbeitet hauptsächlich, indem er alle Objekte, die er finden kann, in einen neuen Teil des RAMs kopiert und dann den alten Bereich aufbricht; es weiß weder, noch interessiert es, ob fünf oder 500.000 Objekte zurückgeblieben sind. Beachten Sie, dass der Garbage Collector nicht nur alle Objekte finden kann, auf die Live-Referenzen verweisen, sondern auch einige andere Objekte, einschließlich Objekte, die Finalize überschreiben, Objekte, die als Monitorsperren verwendet werden, Objekte, auf die WeakReference-Objekte gerichtet sind, usw. Vorher Wenn man das alte Gebiet aus dem Orbit killt, muss sich der Müllsammler mit irgendwelchen "speziellen" Objekten befassen, von denen es weiß, dass sie immer noch dort sitzen.

Unter anderem verfügt der Garbage Collector über eine Liste aller Objekte, die einen Finalizer registriert haben. Alle Objekte in dieser Liste werden daraufhin überprüft, ob sie noch in den neuen Speicherbereich kopiert wurden. Wenn Objekte gefunden werden, die nicht vorhanden sind, werden sie aus der Liste der Objekte mit einem registrierten Finalizer entfernt und zu einer Liste von Objekten hinzugefügt, deren Methode Finalize so bald wie möglich ausgeführt werden sollte. Sobald dies für alle Objekte mit einem registrierten Finalizer durchgeführt wurde, werden alle Objekte in der Liste der Objekte, die sofort finalisiert werden müssen, sowie alle Objekte, für die diese Objekte eine Referenz enthalten, in den neuen Bereich kopiert.

    
supercat 02.03.2012 00:14
quelle