Die Garbage Collection (GC) in Visual Basic .NET ist ein automatischer Prozess zur Speicherverwaltung, der ungenutzte Objekte freigibt und Speicherlecks verhindert. Wenn Objekte erstellt werden, wird Speicher im verwalteten Heap zugewiesen, und wenn es keine Referenzen mehr auf ein Objekt gibt, gibt der Garbage Collector im Laufe der Zeit die belegten Ressourcen frei.
Besonderheiten:
Finalize implementieren, um nicht verwaltete Ressourcen zu bereinigen, es ist jedoch zuverlässiger, das Interface IDisposable und die Methode Dispose zu verwenden.Using-Konstruktion, um die Methode Dispose automatisch aufzurufen.Beispielcode mit Verwendung von Dispose:
Public Class FileManager Implements IDisposable Private disposed As Boolean = False ' ... nicht verwaltete Ressource Public Sub Dispose() Implements IDisposable.Dispose If Not disposed Then ' Ressourcenbereinigung disposed = True End If GC.SuppressFinalize(Me) End Sub Protected Overrides Sub Finalize() Dispose() MyBase.Finalize() End Sub End Class
Kann man sicher sein, dass der Finalisierer eines Objekts beim Programmende aufgerufen wird?
Falsche Antwort: Ja, der Finalisierer wird automatisch aufgerufen, wenn das Objekt nicht mehr benötigt wird.
Richtige Antwort: Nein, der Aufruf des Finalisierers ist beim Beenden des Prozesses nicht garantiert. Finalisierer werden nur aufgerufen, wenn der GC sie rechtzeitig verarbeitet. Um Ressourcen zuverlässig freizugeben, verwenden Sie immer Dispose.
Beispiel:
' Verwendung der Using-Konstruktion zur garantierten Freigabe der Ressource Using mgr As New FileManager() ' Arbeiten mit der Ressource End Using
Geschichte
In einem Projekt zur Verarbeitung von Dateien wurden temporäre Dateien nicht gelöscht, da man nur auf den Finalisierer vertraute. Bei einer großen Anzahl von Dateien kam es zu einer Überlastung des Dateisystems, bis wir den expliziten Aufruf vonDisposeimplementierten.
Geschichte
Ein Entwickler rief nach jeder Operation manuellGC.Collect()auf — das verringerte die Leistung der Anwendung drastisch, da häufige Garbage Collections viel CPU verbrauchten.
Geschichte
In großen Webanwendungen hat einer der Dienste das Dispose-Muster falsch implementiert undGC.SuppressFinalize()nicht aufgerufen. Dies führte zu einer doppelten Bereinigung von Objekten, was unerwartete Abstürze und Speicherlecks verursachte.