logo

Niszczyciel Java

W Javie, gdy tworzymy obiekt klasy, zajmuje on trochę miejsca w pamięci (stercie). Jeśli nie usuniemy tych obiektów, pozostaną one w pamięci i zajmują niepotrzebne miejsce, które nie jest godne programowania. Aby rozwiązać ten problem, używamy niszczyciel . W tej sekcji omówimy alternatywną opcję dla destruktor w Javie . Dowiemy się także, jak korzystać z tzw sfinalizować() metoda jako destruktor.

The niszczyciel jest przeciwieństwem konstruktora. Konstruktor służy do inicjowania obiektów, a destruktor służy do usuwania lub niszczenia obiektu, co zwalnia zasób zajmowany przez obiekt.

Zapamietaj to w Javie nie ma koncepcji destruktora . Zamiast destruktora Java udostępnia moduł zbierający elementy bezużyteczne, który działa tak samo jak destruktor. Moduł zbierający elementy bezużyteczne to program (wątek) działający na platformie JVM . Automatycznie usuwa nieużywane obiekty (obiekty, które nie są już używane) i zwalnia pamięć. Programista nie ma potrzeby ręcznego zarządzania pamięcią. Może być podatny na błędy, podatny na ataki i może prowadzić do wycieku pamięci.

Co to jest destruktor w Javie?

Jest to specjalna metoda, która jest wywoływana automatycznie, gdy obiekt nie jest już używany. Kiedy obiekt zakończy swój cykl życia, moduł zbierający elementy bezużyteczne usuwa ten obiekt i zwalnia lub zwalnia pamięć zajmowaną przez obiekt.

Znany jest również jako finalizatory które są niedeterministyczne. W Jawa , alokację i dealokację obiektów obsługiwanych przez Śmieciarz . Wywołanie finalizatorów nie jest gwarantowane, ponieważ wywołuje je niejawnie.

Zalety destruktora

  • Uwalnia zasoby zajmowane przez obiekt.
  • Nie jest wymagane żadne jawne wywołanie, jest ono automatycznie wywoływane na końcu wykonywania programu.
  • Nie przyjmuje żadnych parametrów i nie można go przeciążać.

Jak działa destruktor?

Kiedy obiekt jest tworzony, zajmuje miejsce na stercie. Obiekty te są używane przez wątki. Jeśli obiekty nie są już używane przez wątek, kwalifikują się do wyrzucenia elementów bezużytecznych. Pamięć zajmowana przez ten obiekt jest teraz dostępna dla nowych, tworzonych obiektów. Należy zauważyć, że gdy moduł zbierający elementy bezużyteczne zniszczy obiekt, środowisko JRE wywołuje metodę finalize() w celu zamknięcia połączeń, takich jak połączenie z bazą danych i połączenie sieciowe.

Z powyższego możemy wywnioskować, że użycie destruktora i modułu zbierającego śmieci to poziom ingerencji programisty w zarządzanie pamięcią. Jest to główna różnica między nimi. Destruktor powiadamia dokładnie, kiedy obiekt zostanie zniszczony. W Javie moduł zbierający elementy bezużyteczne wykonuje tę samą pracę automatycznie. Te dwa podejścia do zarządzania pamięcią mają pozytywne i negatywne skutki. Ale głównym problemem jest to, że czasami programista potrzebuje natychmiastowego dostępu do zarządzania pamięcią.

Metoda Java finalize().

Programiście trudno jest wymusić uruchomienie modułu zbierającego elementy bezużyteczne w celu zniszczenia obiektu. Ale Java zapewnia alternatywny sposób zrobienia tego samego. Klasa obiektu Java udostępnia sfinalizować() metoda działająca tak samo jak destruktor. Składnia metody finalize() jest następująca:

Składnia:

 protected void finalize throws Throwable() { //resources to be close } 

Nie jest to destruktor, ale zapewnia dodatkowe bezpieczeństwo. Zapewnia wykorzystanie zasobów zewnętrznych, np. zamknięcie pliku itp. przed zamknięciem programu. Możemy to wywołać korzystając z samej metody lub wywołując metodę System.runFinalizersOnExit(true) .

  • Jest to chroniona metoda klasy Object zdefiniowana w pakiecie java.lang.
  • Można go wywołać tylko raz.
  • Jeśli chcemy zastąpić metodę, musimy jawnie wywołać metodę finalize().
  • Gc() to metoda JVM wykonywana przez moduł Garbage Collector. Wywołuje się, gdy pamięć sterty jest pełna i wymaga więcej pamięci dla nowych przybywających obiektów.
  • Z wyjątkiem niesprawdzonych wyjątków, maszyna JVM ignoruje wszystkie wyjątki występujące w wyniku metody finalize().

Przykład destruktora

DestructorExample.java

 public class DestructorExample { public static void main(String[] args) { DestructorExample de = new DestructorExample (); de.finalize(); de = null; System.gc(); System.out.println('Inside the main() method'); } protected void finalize() { System.out.println('Object is destroyed by the Garbage Collector'); } } 

Wyjście:

 Object is destroyed by the Garbage Collector Inside the main() method Object is destroyed by the Garbage Collector