Garbage collection (GC) w Visual Basic .NET to automatyczny proces zarządzania pamięcią, który zwalnia nieużywane obiekty, zapobiegając wyciekom pamięci. Przy tworzeniu obiektów pamięć jest przydzielana na zarządzanym stercie, a gdy nie ma więcej odniesień do obiektu, zbieracz śmieci w odpowiednim czasie zwalnia zajmowane zasoby.
Cechy:
Finalize do czyszczenia niezarządzanych zasobów, ale pewniej jest używać interfejsu IDisposable i metody Dispose.Using do automatycznego wywoływania metody Dispose.Przykład kodu z użyciem Dispose:
Public Class FileManager Implements IDisposable Private disposed As Boolean = False ' ... niezarządzany zasób Public Sub Dispose() Implements IDisposable.Dispose If Not disposed Then ' Czyszczenie zasobów disposed = True End If GC.SuppressFinalize(Me) End Sub Protected Overrides Sub Finalize() Dispose() MyBase.Finalize() End Sub End Class
Czy można być pewnym, że finalizator obiektu zostanie wywołany przy zakończeniu programu?
Niepoprawna odpowiedź: Tak, finalizator jest wywoływany automatycznie, gdy obiekt nie jest już potrzebny.
Poprawna odpowiedź: Nie, wywołanie finalizatora nie jest gwarantowane przy zakończeniu procesu. Finalizatory zostaną wywołane tylko jeśli GC zdąży je przetworzyć. Aby pewnie zwolnić zasoby, zawsze używaj Dispose.
Przykład:
' Użycie konstrukcji Using dla zapewnienia zwolnienia zasobu Using mgr As New FileManager() ' Praca z zasobem End Using
Historia
W projekcie do przetwarzania plików pliki tymczasowe nie były usuwane, ponieważ polegano tylko na finalizatorze. Przy dużej liczbie plików występowało przepełnienie systemu plików, aż do momentu wprowadzenia jawnego wywołaniaDispose.
Historia
Programista ręcznie wywoływałGC.Collect()po każdej operacji — to znacznie spowolniło wydajność aplikacji, ponieważ częste zbieranie śmieci zużywało dużo CPU.
Historia
W dużych aplikacjach internetowych jedna z usług niewłaściwie zaimplementowała wzorzec Dispose i nie wywoływałaGC.SuppressFinalize(). To prowadziło do podwójnego czyszczenia obiektów, co powodowało nieprzewidziane awarie i wycieki zasobów.