JavaRush /Blog Java /Random-PL /Śmieciarka w Javie
Diana
Poziom 41

Śmieciarka w Javie

Opublikowano w grupie Random-PL

Linia zachowania modułu zbierającego elementy bezużyteczne (odzyskiwacza pamięci)

Programista Java nie musi monitorować alokacji pamięci, ponieważ moduł zbierający elementy bezużyteczne zarządza pamięcią automatycznie. Moduł Garbage Collector jest uruchamiany przez wirtualną maszynę Java (JVM). Moduł zbierający elementy bezużyteczne to proces o niskim priorytecie, uruchamiany okresowo i zwalniający pamięć używaną przez obiekty, które nie są już potrzebne. Różne maszyny JVM mają różne algorytmy zbierania elementów bezużytecznych. Stosowanych jest kilka algorytmów, na przykład: algorytm zliczania referencji lub algorytmy znaczników i skrobań.Zbiórka śmieci – 1

Uruchamianie modułu zbierającego elementy bezużyteczne w Javie

JVM zazwyczaj uruchamia moduł zbierający elementy bezużyteczne, gdy brakuje wolnej pamięci. Ale działanie modułu zbierającego elementy bezużyteczne nie gwarantuje, że zawsze będzie wystarczająca ilość wolnej pamięci. Jeśli nawet po odzyskaniu nie ma wystarczającej ilości pamięci, maszyna JVM zgłasza wyjątek OutOfMemoryError. Należy pamiętać, że maszyna JVM musi przynajmniej raz uruchomić moduł zbierający elementy bezużyteczne przed zgłoszeniem wyjątku. Możesz zażądać, aby moduł zbierający elementy bezużyteczne działał w Javie, ale nie możesz wymusić tej akcji.

Żądanie uruchomienia modułu zbierającego elementy bezużyteczne

Aby złożyć wniosek, możesz wywołać jedną z następujących metod:
System.gc()
Runtime.getRuntime().gc()

Przydatność do uruchomienia modułu zbierającego śmieci

Przedmiot należy wyrzucić, gdy nie jest już dostępny dla żywego strumienia. Przedmiot może podlegać zbyciu w różnych przypadkach:
  • Jeśli zmienna typu referencyjnego odnosząca się do obiektu jest ustawiona na „0”, obiekt musi zostać usunięty, jeśli nie ma do niego innych odniesień.
  • Jeśli zmienna typu referencyjnego odwołująca się do obiektu jest tworzona w celu odwoływania się do innego obiektu, obiekt należy usunąć, jeśli nie ma do niego innych odniesień.
  • Obiekty utworzone lokalnie w metodzie są odrzucane po zakończeniu metody, chyba że zostaną wyeksportowane z tej metody (to znaczy zwrócone lub zgłoszone jako wyjątek).
  • Obiekty, które się ze sobą odwołują, mogą podlegać utylizacji, jeśli żaden z nich nie jest dostępny dla aktywnego wątku.
Spójrzmy na przykład:
public class TestGC
  {
    public static void main(String [] args)
    {
      Object o1 = new Integer(3);               // Line 1
      Object o2 = new String("Tutorial");       // Line 2
      o1 = o2;                                  // Line 3
      o2 = null;                                // Line 4
      // Rest of the code here
    }
  }
W tym przykładzie Integerobiekt (liczba całkowita), do którego pierwotnie odwoływał się o1, można usunąć po linii 3, ponieważ o1 odnosi się teraz do obiektu String(łańcucha). Mimo że o2 zostało utworzone w celu odwoływania się do wartości null, obiekt String(ciąg znaków) nie nadaje się do recyklingu, ponieważ o1 odnosi się do niego.

Finalizacja

Technologia Java umożliwia użycie metody finalize()(finalizowanie) w celu wykonania niezbędnego czyszczenia, zanim moduł zbierający elementy bezużyteczne pobierze obiekt z pamięci. Ta metoda jest wywoływana na obiekcie przez moduł wyrzucający elementy bezużyteczne, gdy moduł wyrzucający elementy bezużyteczne ustali, że nie ma już żadnych odniesień do obiektu. Jest to opisane w klasie Object, co oznacza, że ​​jest dziedziczone przez wszystkie klasy. Podklasa zastępuje metodę, finalize()aby uwolnić się od zasobów systemowych lub w celu innego czyszczenia:
protected void finalize() throws Throwable
Jeżeli metoda zgłosi niezarejestrowany wyjątek finalize(), zostanie on zignorowany i finalizacja obiektu zostanie zatrzymana. Metoda finalize()zostanie wywołana tylko raz w okresie istnienia obiektu. Na dowolnym przedmiocie można zastosować metodę finalize()zabezpieczającą go przed utylizacją. Jednak w tym przypadku moduł zbierający elementy bezużyteczne nie jest już aktywowany finalize()dla tego obiektu. Metoda finalize()będzie zawsze wywoływana raz, zanim obiekt zostanie usunięty. Może się jednak zdarzyć, że metoda finalize()nie zostanie uruchomiona dla danego obiektu przez cały okres jego istnienia, gdyż może nie podlegać on utylizacji.

Streszczenie

W tej sekcji przyjrzeliśmy się procesowi zbierania śmieci, który jest techniką zarządzania pamięcią w języku Java. Nie można wymusić wywozu śmieci. Dowiedzieliśmy się o różnych sposobach kwalifikowania obiektów do recyklingu i dowiedzieliśmy się, że metoda finalize()jest wywoływana, zanim obiekt zostanie odzyskany przez moduł zbierający elementy bezużyteczne.

Ćwiczenia

Pytanie: Ile obiektów będzie podlegało zbyciu po linii 7?
public class TutorialGC
  {
    public static void main(String [] args)
    {
      Object a = new Integer(100);  // Line1
      Object b = new Long(100);     // Line2
      Object c = new String("100"); // Line3
      a = null;                     // Line4
      a = c;                        // Line5
      c = b;                        // Line6
      b = a;                        // Line7
      // Rest of the code here
    }
  }
Opcje odpowiedzi: A. 0 B. 1 C. 2 D. 3 E. Kodu nie da się skompilować Prawidłowa opcja: B Wyjaśnienie: Z trzech obiektów utworzonych w wierszach 1, 2 i 3, jedynie obiekt Integernależy wyrzucić w punkcie koniec linii 7. Odniesienia do zmiennej a, która pierwotnie odwoływała się do obiektu Integer, odwołuje się do obiektu Stringw linii 5. Zatem Integerobiekt musi zostać usunięty po linii 5, ponieważ nie ma żadnych zmiennych, które odwołują się do niego. Zmienne bi codnoszą się do obiektów Stringi Longobiektów w wierszach 6 i 7, więc nie podlegają recyklingowi.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION