Usuń i sfinalizuj

Anonim

W językach programowania obiekt może mieć tylko zmienną podczas swojego istnienia, po wystąpieniu nie można go modyfikować. Taka sama komórka pamięci nie może być przypisana do nowych wartości, dlatego do zarzą dzania nieużywanymi miejscami potrzebne jest pewne zautomatyzowane zarządzanie pamięcią. Te niewykorzystane przestrzenie są nazywane śmieciami, a cały proces wydajnego zarządzania pamięcią nazywa się wyrzucaniem śmieci.

Głównym celem odśmiecacza jest oddzielenie martwych obiektów od żywych obiektów i odzyskanie miejsca do ponownego użycia. Zasadniczo cała operacja działa na sterowanej stercie, która jest niczym innym jak blokiem pamięci, a moduł czyszczenia pamięci okresowo sprawdza pamięć sterty, aby przydzielić pamięć do nowych obiektów. Istnieją dwie metody udostępniania niezarządzanych zasobów, takich jak pliki i połączenia z bazami danych: Utylizacja i Finalizacja.

Ten artykuł pomaga zrozumieć różnicę między tymi dwoma.

Co to jest metoda usuwania?

Utylizacja to standardowy sposób, w jaki użytkownicy mogą nakazać obiektom zwolnienie ich zasobów i nie próbować ponownie uzyskać dostępu do obiektów. Metoda dispose zapewnia kontrolę jawnego czyszczenia pamięci przez renderowanie obiektów bezużytecznych.

Kiedy użytkownicy nazywają metodę Dispose (), obiekt ma zwolnić wszystkie drogie zasoby, dzięki czemu jest dostępny do ponownego wykorzystania. Nigdy nie jest wywoływany przez garbage collector, który pojawia się tylko wtedy, gdy pamięć zarządzana staje się rzadka. Specjalny interfejs o nazwie "IDisposable" służy do określenia miejsca i sposobu wdrożenia Dispose (). Ale co się stanie, gdy metoda dispose nie zostanie wywołana?

Co to jest metoda finalizacji?

Jeśli metoda dispose nie zostanie wywołana, to awaryjnym planem jest użycie metody Finalize () do czyszczenia. Jest wywoływany przez garbage collector, aby przeprowadzić ostateczne oczyszczanie zasobów, zanim zwolni pamięć. Pojęcie terminowego czyszczenia przestaje mieć zastosowanie, ponieważ zamiast oddzielać pamięć natychmiast, obiekt jest dodawany do kolejki finalizacji, aby później zostać zniszczony. Finalizacja jest bardziej jak zabezpieczenie wprowadzone w przypadku błędu programowania, a utylizacja nie powoduje wyczyszczenia zasobów, w którym to przypadku wywoływarka wywołuje metodę Finalize (), aby usunąć nieosiągalne obiekty w dowolnej kolejności.

Różnica między utylizacją a finalizacją

Podstawy rozporządzania i finalizowania

Metoda Dispose jest wywoływana w celu przyspieszenia uwalniania zasobów niezarządzanych, takich jak uchwyty do baz danych, uchwyty plików, semafory i inne obiekty przydzielane przez system operacyjny. Metoda dispose jest wywoływana w celu wykonania kodu wymaganego do czyszczenia nieużywanej pamięci i rzadkich zasobów, takich jak uchwyty GDI. W prostych słowach metoda dispose zapewnia kontrolę jawnego czyszczenia pamięci. Z drugiej strony, metoda finalizacji jest częścią procesu czyszczenia pamięci używanego do przeprowadzenia operacji końcowego czyszczenia na obiekcie, zanim zostanie on zebrany. Po prostu, sfinalizowanie metody jest wywoływane w celu uwolnienia niezarządzanych zasobów przechowywanych przez obiekt, zanim zostanie zniszczony.

Wywoływanie utylizacji i finalizacji

Metoda dispose może być wywołana jawnie przez kod użytkownika i klasę, która implementuje metodę do dysponowania zasobami. Jednak pamięć nie może zostać zwolniona, dopóki garbage collector nie wykona procesu czyszczenia. Metodę można wywołać nawet wtedy, gdy nadal istnieją inne odwołania do obiektu. Ostatecznie metoda finalizacji może zostać wywołana przez garbage collector dopiero po stwierdzeniu, że ostatnia instancja obiektu pamięci jest zniszczona i nie ma już żadnych odniesień do obiektu. Po wykonaniu metody finalizacji obiekt jest usuwany z pamięci sterty.

Implementacja Dispose and Finalize

Proces wyrzucania obiektu z pamięci nosi nazwę wzorca utylizacji, który można wykorzystać w przypadku obiektów uzyskujących dostęp do zasobów niezarządzanych, ponieważ moduł do zbierania śmieci nie może odzyskać zasobów niezarządzanych. Zostanie zaimplementowany interfejs "IDisposable" wraz z dodatkową metodą Dispose (Boolean) z prośbą o udostępnienie niezarządzanych zasobów. Metoda sfinalizowania jest wykonywana, gdy instancja obiektu zostanie zniszczona przed jego dealokacją. Jest to metoda niedeterministyczna, która odbywa się według uznania śmieciarza i może nawet nie wystąpić. Nie należy go wdrażać na obiektach zarządzanych, dopóki nie będzie to konieczne.

Wydajność usuwania i finalizowania

O wiele szybciej jest użyć metody dispose zamiast finalizacji do natychmiastowego usuwania obiektów. Destruktory są automatycznie konwertowane do sfinalizowania metody w czasie wykonywania. Jest on wywoływany automatycznie przez garbage collector, gdy obiekt wychodzi poza zasięg, co zwykle dzieje się, gdy instancja tego obiektu zostanie zniszczona. Problem z metodą finalizacji polega na tym, że jest niedeterministyczny, co oznacza, że ​​nie ma pewności, kiedy odzyskać pamięć, której nie można już odwoływać poprzez zbieranie pamięci. Jednak nie może natychmiast uwolnić pamięci; w rzeczywistości nigdy nie można go nazwać i nie można go wyraźnie wymusić.

Dispose vs. Finali: Tabela porównawcza

Podsumowanie utylizacji vs Ukończenie

Główną różnicą między metodami utylizacji i sfinalizowania jest to, że pierwsza jest deterministyczną metodą, która natychmiastowo pozbywa się obiektów, gdy nie są już używane, podczas gdy druga jest niedeterministyczną metodą przydzielania zasobów niezarządzanych, co oznacza, że ​​jest metodą wystąpienia obiektów pamięci, gdy wykraczają one poza zakres przed ich dealokacją.Zawsze zaleca się stosowanie metody usuwania przed sfinalizowaniem, chyba że jest to wyjątkowo konieczne.

Innymi słowy, sfinalizowanie jest zabezpieczeniem wprowadzonym w celu oczyszczenia niezarządzanych zasobów, gdy metoda unieszkodliwienia nie może zostać wywołana w przypadku błędu programowania. Metoda finalizacji wywoływana jest przez garbage collector, gdy obiekt ma zostać wyrzucony z pamięci sterty.