W językach programowania obiekt może mieć tylko zmienną podczas swojego istnienia, po utworzeniu instancji nie można go modyfikować. Tak więc tej samej komórki pamięci nie można przypisać do nowych wartości, dlatego do zarządzania nieużywanymi przestrzeniami wymagany jest pewien rodzaj automatycznego zarządzania pamięcią. Te nieużywane przestrzenie nazywane są śmieciami, a cały proces efektywnego zarządzania pamięcią nazywany jest śmieciami.
Głównym celem śmieciarza jest oddzielenie martwych obiektów od żywych obiektów i odzyskanie miejsca do ponownego użycia. Zasadniczo wszystko działa na zarządzanej 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 zwalniania niezarządzanych zasobów, takie jak pliki i połączenia z bazą danych: Usuwanie i finalizowanie.
Ten artykuł pomaga zrozumieć różnicę między nimi.
Dispose to standardowy sposób, w jaki użytkownicy mogą nakazać obiektom zwolnić swoje zasoby i nie próbować ponownie uzyskiwać dostępu do obiektów. Metoda usuwania zapewnia kontrolę jawnego czyszczenia pamięci, czyniąc obiekty bezużytecznymi.
Gdy użytkownicy wywołują metodę Dispose (), obiekt powinien zwolnić wszystkie swoje drogie zasoby, tym samym udostępniając go do ponownego użycia. Śmieciarka nie wywołuje go nigdy, który pojawia się tylko w przypadku braku pamięci zarządzanej. Specjalny interfejs o nazwie „IDisposable” służy do decydowania o tym, gdzie i jak zaimplementować Dispose (). Ale co się stanie, gdy metoda dispose nie zostanie wywołana?
Jeśli metoda dispose nie zostanie wywołana, plan zastępczy polega na użyciu metody Finalize () do czyszczenia. Jest on wywoływany przez moduł wyrzucający elementy bezużyteczne w celu przeprowadzenia ostatecznego czyszczenia zasobów przed zwolnieniem pamięci. Pojęcie terminowego czyszczenia nie ma tutaj zastosowania, ponieważ zamiast natychmiastowej alokacji pamięci, obiekt jest dodawany do kolejki finalizacji, aby go później zniszczyć. Finalize przypomina bardziej zabezpieczenie wprowadzone w przypadku błędu programowania, a dispose nie oczyszcza zasobów, w którym to przypadku metoda Finalize () jest wywoływana przez moduł wyrzucający elementy bezużyteczne w celu usunięcia nieosiągalnych obiektów w dowolnej kolejności, jaką lubi.
Wywoływana jest metoda Dispose w celu przyspieszenia uwalniania niezarządzanych zasobów, takich jak uchwyty bazy danych, uchwyty plików, semafory i inne obiekty przydzielane przez system operacyjny. Wywoływana jest metoda usuwania w celu wykonania kodu wymaganego do wyczyszczenia nieużywanej pamięci i ograniczonych zasobów, takich jak uchwyty GDI. Mówiąc prościej, metoda usuwania zapewnia kontrolę jawnego czyszczenia pamięci. Z drugiej strony, metoda finalizacji jest częścią wyrzucania elementów bezużytecznych służących do wykonania ostatecznej operacji czyszczenia obiektu przed jego odebraniem. Mówiąc najprościej, wywoływana jest metoda finalizacji w celu uwolnienia niezarządzanych zasobów przechowywanych przez obiekt przed jego zniszczeniem.
Metoda Dispose może być jawnie wywołana przez kod użytkownika i klasę, która implementuje metodę dysponowania zasobami. Jednak pamięci nie można zwolnić, dopóki moduł czyszczenia pamięci nie wykona procesu czyszczenia. Metodę można wywołać, nawet jeśli istnieją jeszcze inne odwołania do obiektu. Przeciwnie, metoda finalizacji może zostać wywołana przez moduł czyszczenia pamięci tylko wtedy, gdy ustali, że ostatnia instancja obiektu pamięci jest zniszczona i nie ma już żadnych odwołań do obiektu. Po wykonaniu metody finalizacji obiekt jest usuwany z pamięci sterty.
Proces usuwania obiektu z pamięci nazywa się wzorem usuwania, którego można użyć w przypadku obiektów uzyskujących dostęp do niezarządzanych zasobów, ponieważ śmieciarz nie jest w stanie odzyskać niezarządzanych zasobów. Zaimplementowano interfejs „IDisposable” wraz z dodatkową metodą Dispose (Boolean) z prośbą o zwolnienie niezarządzanych zasobów. Metoda finalizacji jest wykonywana, gdy wystąpienie obiektu zostanie zniszczone przed jego zwolnieniem. Jest to niedeterministyczna metoda, która występuje według uznania śmieciarza i może nawet nie wystąpić. Nie należy go wdrażać na zarządzanych obiektach, dopóki nie będzie to absolutnie konieczne.
O wiele szybciej jest użyć metody usuwania niż sfinalizować w celu natychmiastowego usunięcia obiektów. Niszczyciele są automatycznie konwertowane na metodę finalizacji w czasie wykonywania. Jest on automatycznie wywoływany przez moduł wyrzucający elementy bezużyteczne, gdy obiekt wykracza poza zakres, co zwykle ma miejsce, gdy instancja tego obiektu zostanie zniszczona. Problem z metodą finalizacji polega na tym, że nie jest ona deterministyczna, co oznacza, że nie ma pewności, kiedy odzyskać pamięć, do której nie ma już odniesienia poprzez odśmiecanie. Jednak nie może natychmiast zwolnić pamięci; w rzeczywistości nigdy nie można go wywołać i nie można go wyraźnie wymusić.
Główną różnicą między metodami usuwania i finalizowania jest to, że ta pierwsza jest metodą deterministyczną, która natychmiast pozbywa się obiektów, gdy nie są one już w użyciu, podczas gdy druga jest niedeterministyczną metodą alokacji niezarządzanych zasobów, co oznacza, że jest to metoda zabezpieczająca przed zwolnieniem instancje obiektów pamięci, gdy wykraczają poza zakres przed ich zwolnieniem. Zawsze zaleca się stosowanie metody usuwania w celu finalizacji, chyba że jest to niezwykle konieczne.
Innymi słowy, finalizacja jest zabezpieczeniem wprowadzonym w celu oczyszczenia niezarządzanych zasobów, gdy nie można wywołać metody usuwania w przypadku błędu programistycznego. Metoda finalizacji jest wywoływana przez moduł wyrzucający elementy bezużyteczne, gdy obiekt ma zostać wyrzucony z pamięci sterty.