3 Stimmen

Was ist der Sinn des Garbage Collectors?

SqlConnection connection = new SqlConnection(FROM_CONFIGURATION) 
SqlCommand command = new SqlCommand("SomeSQL", connection); 
connection.Open(); 
command.ExecuteNonQuery(); 
command.Dispose(); 
connection.Dispose();

Es wird empfohlen, dass der obige Code try/catch (oder using) enthält, damit im Falle einer Ausnahme alle Ressourcen ordnungsgemäß entsorgt werden.

Aber wenn man sich um die manuelle Entsorgung kümmern muss, was ist dann der Sinn der GC?! Ist GC nicht dazu da, dies für den Programmierer zu erledigen?

15voto

rslite Punkte 77347

Wie andere Leute hier sagten, ist die GC nicht-deterministisch, so dass Sie nicht wissen, wann Ihr Objekt gesammelt wird. Was ich klarstellen möchte ist, dass dies kein Problem mit dem Speicher ist, sondern mit den Systemressourcen (geöffnete Dateien, Datenbankverbindungen), die teuer sind und so schnell wie möglich freigegeben werden sollten. Mit Dispose können Sie das tun, wenn Sie wissen, dass Sie die Verbindung nicht mehr benötigen. Wenn sie nicht rechtzeitig freigegeben werden, kann es sein, dass dem System diese Ressourcen ausgehen, und der GC weiß das nicht. Deshalb müssen Sie dies manuell tun.

Außerdem möchte ich hinzufügen, dass die Verwendung der "using"-Anweisung dies auf eine nette Art und Weise für Sie erledigt.

7voto

ddaa Punkte 49943

Die Müllabfuhr kümmert sich um die Freigabe von ungenutzten Speicher .

Es gibt verschiedene Gründe, warum die Erweiterung der GC zur Freigabe anderer Ressourcen problematisch ist. Einer davon ist, dass Finalizer (Methoden, die ausgeführt werden, wenn ein Objekt garbage collected wird) Referenzzyklen uneinholbar machen, es sei denn, Sie schränken die Dereferenzierung von Finalizern stark ein, was ihre Verwendung sehr schwierig macht.

Ein weiterer Grund ist, dass die meisten Ressourcen zeitnah freigegeben werden müssen, was nicht möglich ist, wenn man sich auf die Garbage Collection verlässt.

Ein weiterer Grund ist, dass die Beschränkung von GC auf die Speicherverwaltung das Problem der große Masse der Ressourcenverwaltung in jeder Anwendung, und fast alle der uninteressant Ressourcenmanagement. Andere Ressourcen sind in der Regel so interessant, dass sie es verdienen zusätzlichen Code, um genau festzulegen, wie sie freigegeben werden.

Ein weiterer Grund ist, dass GC in einigen Anwendungen die Anwendung schneller macht, weil es die Menge an Kopiervorgängen reduziert, um die Semantik des Eigentums zu berücksichtigen. Dies ist bei anderen Ressourcen nicht der Fall.

Andere Leute könnten stundenlang so weitermachen.

6voto

Michael Burr Punkte 320591

Aber wenn Sie sich Sorgen machen müssen über manuell zu entsorgen, was ist dann der der Sinn der GC?! Ist GC nicht dazu da um dies für den Programmierer zu erledigen?

Das Problem ist, dass Sie keine Ahnung haben wenn wird der GC laufen. Und wenn Ihre Anwendung niemals Druck auf den Speicher ausübt, läuft sie möglicherweise überhaupt nicht.

5voto

plinth Punkte 46829

Angenommen, ich habe diesen Code:

class MonkeyGrabber : IDisposable {
   public MonkeyGrabber() { /* construction grabs a real, live monkey from the cage */
   public void Dispose() { Dispose(true); /* releases the monkey back into the cage */ }
   // the rest of the monkey grabbing is left as an exercise to grad student drones
}

class MonkeyMonitor {
    public void CheckMonkeys() {
        if (_monkeyPool.GettingTooRowdy()) {
            MonkeyGrabber grabber = new MonkeyGrabber();
            grabber.Spank();
        }
    }
}

Jetzt überprüft mein MonkeyMonitor die Affen, und wenn sie zu rüpelhaft sind, erhält er eine wertvolle Systemressource - eine einzelne Affenkralle, die am System befestigt ist, und benutzt sie, um einen Affen zu packen und ihm den Hintern zu versohlen. Da ich sie nicht entsorgt habe, hält die Affenkralle den Affen immer noch fest und lässt ihn über dem Restkäfig baumeln. Wenn der Rest der Affen weiter randaliert, kann ich keinen neuen MonkeyGrabber machen, da er immer noch nach oben hilft. Ups. Ein konstruiertes Beispiel, aber du verstehst den Punkt: Objekte, die IDisposable implementieren, können begrenzte Ressourcen aufbewahren, die rechtzeitig freigegeben werden sollten. Der GC kann irgendwann loslassen oder auch nicht.

Darüber hinaus müssen einige Ressourcen rechtzeitig freigegeben werden. Ich habe eine Reihe von Klassen, die, wenn sie nicht von entweder app oder GC entsorgt werden, bevor die Anwendung beendet wird die App zum Absturz hart, wie die nicht verwalteten Ressourcen-Manager, von dem sie kamen, ist bereits durch die Zeit der GC bekommt um es weg.

Mehr über IDisposable .

Benutzen ist dein Freund - Es kommt dem am nächsten, was wir bisher haben. RAII .

4voto

Orion Adrian Punkte 18345

Objekte, die IDisposable implementieren, versuchen, Ihnen mitzuteilen, dass sie Verknüpfungen zu Strukturen haben, die kein verwalteter Speicher sind. Der Garbage Collector arbeitet in Batches, um die Effizienz zu erhöhen. Das bedeutet jedoch, dass es eine Weile dauern kann, bis Ihr Objekt entsorgt ist, was bedeutet, dass Sie Ressourcen länger als nötig aufbewahren, was sich negativ auf die Leistung, Zuverlässigkeit und Skalierbarkeit auswirken kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X