Garbage collection (Garbage Collection, GC) in Visual Basic .NET is een automatisch geheugenbeheerproces dat ongebruikte objecten vrijgeeft, waardoor geheugenlekken worden voorkomen. Bij het creëren van objecten wordt geheugen toegekend op de beheerde heap, en wanneer er geen verwijzingen meer naar een object zijn, zal de garbage collector na verloop van tijd de ingenomen middelen vrijgeven.
Kenmerken:
Finalize-methode implementeren om ongecontroleerde middelen vrij te geven, maar het is betrouwbaarder om de interface IDisposable en de Dispose-methode te gebruiken.Using-constructie voor automatische aanroep van de Dispose-methode.Voorbeeldcode met gebruik van Dispose:
Public Class FileManager Implements IDisposable Private disposed As Boolean = False ' ... ongecontroleerde bron Public Sub Dispose() Implements IDisposable.Dispose If Not disposed Then ' Vrijgeven van middelen disposed = True End If GC.SuppressFinalize(Me) End Sub Protected Overrides Sub Finalize() Dispose() MyBase.Finalize() End Sub End Class
Kun je erop vertrouwen dat de finalizer van een object wordt aangeroepen bij het afsluiten van het programma?
Verkeerd antwoord: Ja, de finalizer wordt automatisch aangeroepen wanneer het object niet meer nodig is.
Juist antwoord: Nee, de aanroep van de finalizer is niet gegarandeerd bij het beëindigen van het proces. Finalizers worden alleen aangeroepen als de GC ze kan verwerken. Gebruik altijd Dispose voor betrouwbare middelenvrijgave.
Voorbeeld:
' Gebruik van de Using-constructie voor gegarandeerde vrijgave van de bron Using mgr As New FileManager() ' Werken met de bron End Using
Verhaal
In een project voor bestandsverwerking werden tijdelijke bestanden niet verwijderd, omdat men alleen op de finalizer vertrouwde. Bij een groot aantal bestanden traden er problemen op met de bestandssystemen totdat een expliciete aanroep vanDisposewerd geïmplementeerd.
Verhaal
Een ontwikkelaar riep handmatigGC.Collect()aan na elke bewerking—dit vertraagde de prestaties van de applicatie drastisch, omdat frequente garbage collections veel CPU verbruikten.
Verhaal
In grote webapplicaties implementeerde een van de services het Dispose-patroon niet correct en riepGC.SuppressFinalize()niet aan. Dit leidde tot dubbele schoonmaak van objecten wat onverwachte crashes en geheugenlekken veroorzaakte.