La raccolta dei rifiuti (Garbage Collection, GC) in Visual Basic .NET è un processo automatico di gestione della memoria che libera gli oggetti non utilizzati, prevenendo perdite di memoria. Quando si creano oggetti, la memoria viene allocata nell'heap gestito e quando non ci sono più riferimenti all'oggetto, il raccoglitore di rifiuti libera nel tempo le risorse occupate.
Caratteristiche:
Finalize per pulire le risorse non gestite, ma è più sicuro utilizzare l'interfaccia IDisposable e il metodo Dispose.Using per chiamare automaticamente il metodo Dispose.Esempio di codice che utilizza Dispose:
Public Class FileManager Implements IDisposable Private disposed As Boolean = False ' ... risorsa non gestita Public Sub Dispose() Implements IDisposable.Dispose If Not disposed Then ' Pulizia delle risorse disposed = True End If GC.SuppressFinalize(Me) End Sub Protected Overrides Sub Finalize() Dispose() MyBase.Finalize() End Sub End Class
Si può essere certi che il finalizzatore di un oggetto verrà chiamato al termine del programma?
Risposta errata: Sì, il finalizzatore viene chiamato automaticamente quando l'oggetto non è più necessario.
Risposta corretta: No, la chiamata al finalizzatore non è garantita al termine del processo. I finalizzatori saranno chiamati solo se il GC riesce a elaborarli. Per liberare risorse in modo affidabile, utilizza sempre Dispose.
Esempio:
' Utilizzo della costruzione Using per garantire la liberazione delle risorse Using mgr As New FileManager() ' Lavorare con la risorsa End Using
Storia
Nel progetto di elaborazione dei file, i file temporanei non venivano eliminati, poiché ci si basava solo sul finalizzatore. Con un grande volume di file, si verificava un sovraccarico del file system, finché non è stato implementato un richiamo esplicito aDispose.
Storia
Un sviluppatore chiamava manualmenteGC.Collect()dopo ogni operazione, il che ha rallentato drasticamente le prestazioni dell'applicazione, poiché frequenti raccolte di rifiuti consumavano molta CPU.
Storia
In grandi applicazioni web, uno dei servizi ha implementato in modo errato il modello Dispose e non ha chiamatoGC.SuppressFinalize(). Questo ha portato a una doppia pulizia degli oggetti, causando crash inaspettati e perdite di risorse.