what is garbage collection java
Ten samouczek wyjaśnia, czym jest Garbage Collection w Javie i jak działa Garbage Collector. Dowiesz się również o algorytmach zbierania śmieci:
Czytelnicy znający się na C / C ++ muszą być świadomi, że to programista jest odpowiedzialny za tworzenie i usuwanie obiektów w C / C ++.
Poważne błędy pojawiają się, gdy programista zapomni zniszczyć utworzone obiekty. Dzieje się tak, ponieważ niepowodzenie w zniszczeniu obiektów może spowodować „ Brak pamięci ”Błędy, wycieki pamięci itp.
Ta sytuacja jest całkowicie rozwiązana w Javie, ponieważ nie ma potrzeby, aby programista śledził obiekty. Java dba o niszczenie obiektów za nas poprzez automatyczne usuwanie śmieci.
=> Odwiedź tutaj, aby nauczyć się języka Java od podstaw.
Proces, w którym obiekty, które nie są już używane, są usuwane z pamięci sterty, nazywa się „Wyrzucaniem elementów bezużytecznych”. Technika czyszczenia pamięci jest częścią zarządzania pamięcią w Javie.
Dlatego w Javie Garbage Collector niszczy wszystkie obiekty, które nie są już używane.
Czego się nauczysz:
- Co to jest garbage collector w Javie?
- Jak działa funkcja Garbage Collection w Javie?
- Algorytmy czyszczenia pamięci w Javie
- Wniosek
Co to jest garbage collector w Javie?
Garbage Collector w Javie jest zarządzany przez program o nazwie Garbage Collector.
Garbage Collector można zdefiniować jako program służący do automatycznego zarządzania pamięcią poprzez obsługę usuwania alokacji obiektów.
Wiemy, że w języku Java nowe obiekty są tworzone i przydzielane pamięci za pomocą operatora new. Pamięć przydzielona do obiektu przy użyciu nowego operatora pozostaje przydzielona, dopóki odwołania nie będą używać tego obiektu.
Gdy tylko odniesienia przestaną istnieć, pamięć zajmowana przez obiekt jest odzyskiwana. Następnie Java automatycznie obsługuje cofanie alokacji lub niszczenie obiektów i nie musimy jawnie niszczyć obiektu.
Ta technika jest techniką Garbage Collection w Javie, w której programiści nie muszą jawnie zajmować się cofaniem alokacji obiektów.
Należy zauważyć, że jeśli programy nie usuwają alokacji pamięci, gdy obiekty jej nie potrzebują, ostatecznie nie będzie już pamięci do przydzielenia i programy ulegną awarii. Ta sytuacja nazywa się wyciekiem pamięci.
Moduł odśmiecania pamięci zawsze działa w tle w wątku demona. Za najlepszy przykład wątku demona uważa się Garbage Collector.
Garbage Collector działa z zamiarem zwolnienia pamięci sterty. Czyni to poprzez niszczenie obiektów, które są „nieosiągalne”.
Co to jest „nieosiągalny” obiekt?
Obiekt staje się nieosiągalny, gdy nie ma z nim żadnego powiązanego odniesienia.
Rozważmy następujący fragment kodu:
Integer ref_obj = new Integer (5); //ref_obj is a reference to Integer ref_obj = null; //Integer object now becomes unreachable
Jak widać z powyższego kodu, obiekt jest osiągalny, o ile jest z nim skojarzone odniesienie. W momencie usunięcia powiązania odniesienia (w powyższym przypadku odniesienie do ustawienia na wartość null) obiekt staje się nieosiągalny.
Gdy obiekt staje się nieosiągalny, kwalifikuje się do wyrzucania elementów bezużytecznych (GC).
Jak możemy zakwalifikować obiekt do GC?
Chociaż programista nie musi niszczyć obiektów, którymi zajmuje się GC, przynajmniej programista może uczynić te obiekty nieosiągalnymi, gdy nie są już potrzebne.
W ten sposób GC zbierze nieosiągalne obiekty i je zniszczy.
Istnieje kilka sposobów, aby obiekt kwalifikował się do GC, czyniąc go nieosiągalnym.
Oni są:
# 1) Anuluj odniesienie
Mając odniesienie przypisane do obiektu, jeśli ten obiekt nie jest już potrzebny, przypisz odwołanie do null.
Student s = new Student (); s = null;
Gdy s ma wartość null, obiekt studenta staje się nieosiągalny.
# 2) Przypisz ponownie odniesienie
To kolejny sposób na zakwalifikowanie obiektów do GC.
Rozważmy następujący kod.
Student s1 = new Student (); Student s2 = new Student (); s1 = s2;
Teraz, gdy przypisaliśmy s1 do innego obiektu, obiekt Studenta, do którego odwołuje się s1, jest wyłuskiwany.
# 3) Utwórz anonimowy obiekt
Tworząc anonimowy obiekt, możemy sprawić, by obiekty kwalifikowały się do GC.
Możemy stworzyć anonimowy obiekt, jak pokazano poniżej:
new Student();
Po zakwalifikowaniu obiektów do GC, obiekty te mogą, ale nie muszą, zostać natychmiast zniszczone przez GC. Dzieje się tak, ponieważ nie możemy jawnie zmusić GC do wykonania, kiedy i kiedy chcemy.
Kiedy działa Garbage Collector?
Uruchomienie programu Garbage Collector należy do maszyny JVM. Kiedy JVM uruchamia moduł wyrzucania elementów bezużytecznych, nieosiągalne obiekty są niszczone. Mimo to nie możemy zagwarantować, kiedy JVM będzie działać.
Chociaż nie możemy zmusić GC do wykonania, możemy bardzo dobrze poprosić o wyrzucanie elementów bezużytecznych.
GC można zażądać przy użyciu dowolnej z następujących metod.
# 1) System.gc (): Klasa System języka Java udostępnia statyczną metodę gc (), za pomocą której możemy zażądać od maszyny JVM uruchomienia narzędzia Garbage Collector.
# 2) Runtime.getRuntime (). Gc (): Podobnie jak System.gc (), możemy również użyć metody gc () „Runtime class”, aby zażądać uruchomienia JVM w celu uruchomienia Garbage Collectora.
Uwaga: Nie ma gwarancji, że moduł wyrzucania elementów bezużytecznych będzie działał po żądaniu z tych dwóch metod.
Finalizacja
Finalizacja jest wykonywana przez Garbage Collectora tuż przed zniszczeniem obiektów. Jako część techniki finalizacji, Garbage Collector wywołuje metodę finalize () na obiekcie. Metoda finalize () służy do wykonywania czynności czyszczenia.
Metoda finalize () jest udostępniana przez klasę „Object” i ma następujący prototyp.
protected void finalize () throws Throwable
Metoda finalize () jest wywoływana za każdym razem, gdy obiekt jest usuwany z pamięci
Uwaga: Moduł wyrzucania elementów bezużytecznych zbiera tylko obiekty utworzone przy użyciu słowa kluczowego new. W przypadku innych obiektów musimy użyć metody finalize (), aby wykonać czyszczenie.
Poniższy program przedstawia prosty sposób usuwania pamięci w Javie.
class TestGC{ @Override // finalize method: called on object once // before garbage collecting it protected void finalize() throws Throwable { System.out.println('Garbage collector called'); System.out.println('Object garbage collected : ' + this); } } class Main{ public static void main(String args()){ TestGC gc1=new TestGC(); TestGC gc2=new TestGC(); gc1 = null; //nullify gc1 System.gc(); //request for GC to run gc2 = null; //nullify gc2 Runtime.getRuntime().gc(); //request for GC to run } }
Wynik
W powyższym programie stworzyliśmy klasę TestGC. W tej klasie nadpisaliśmy metodę finalize (). Następnie w klasie głównej tworzymy dwa obiekty klasy TestGC. Najpierw unieważniamy obiekt i wywołujemy System.gc (), aby zażądać garbage collectora.
Następnie unieważniamy drugi obiekt i wywołujemy metodę Runtime.getRuntime.gc (), aby zażądać Garbage Collectora. Dane wyjściowe pokazują dwukrotnie dane wyjściowe metody finalize, co oznacza, że moduł wyrzucania elementów bezużytecznych został uruchomiony dwukrotnie.
Uwaga: Chociaż otrzymaliśmy ten wynik, nie ma gwarancji, że za każdym razem otrzymamy ten sam wynik. To całkowicie zależy od JVM.
Jak działa funkcja Garbage Collection w Javie?
W tej sekcji zobaczymy, jak działa Garbage Collection w Javie.
Podczas czyszczenia pamięci Garbage Collector sprawdza pamięć Heap, a następnie „zaznacza” nieosiągalne obiekty. Potem je niszczy.
Ale problem pojawia się, gdy liczba obiektów wzrasta. Wraz ze wzrostem liczby obiektów wydłuża się również czas zbierania elementów bezużytecznych, ponieważ szuka nieosiągalnych obiektów. Jednak nie wpływa to zbytnio, ponieważ większość obiektów ma krótką żywotność.
Powyższe zachowanie nazywa się „Generational Garbage Collection” i ma poprawić wydajność JVM. W tym podejściu cała przestrzeń Heap jest podzielona na - Young Generation, Old lub Tenured Generation i Permanent Generation.
# 1) Miejsce na stertę młodego pokolenia: W tej przestrzeni powstają wszystkie nowe obiekty. Gdy przestrzeń jest pełna, odbywa się Minor GC, w którym wszystkie martwe obiekty są niszczone. Drobny proces GC jest szybki i szybki, ponieważ większość obiektów jest martwa. Przedmioty, które przetrwały młode pokolenie, są przenoszone do starszych pokoleń.
# 2) Przestrzeń na stosie starej generacji: Ta generacja przechowuje obiekty, które przetrwają długo. Po osiągnięciu progu wieku młodego pokolenia obiekt przenosi się do pokolenia starego. Kiedy przestrzeń starej generacji jest wypełniona, wykonywany jest Major GC.
Major GC jest powolny, ponieważ zaangażowane tutaj obiekty są obiektami na żywo. Czasami cała przestrzeń Sterty, obejmująca młode i stare pokolenia, zostaje wyczyszczona. Nazywa się to „Full GC”.
# 3) Trwała generacja L. Aż do Java 7 istniała Permanent Generation (Perm Gen). Przechowywane metadane Perm Gen były używane przez JVM. JVM wykorzystała te metadane do opisania klas i metod używanych w aplikacji. Perm Gen został usunięty w Javie 8.
Java 8 Garbage Collection: Perm Gen i metaspace
Wspomnieliśmy już o przestrzeni Perm Gen, która była obecna do Javy 7. Jednak teraz w Javie 8 JVM reprezentuje metadane klasy przy użyciu rodzimej pamięci o nazwie „Metaspace”.
Oprócz Metaspace istnieje nowa flaga o nazwie „MaxMetaspaceSize”, która ogranicza ilość pamięci używanej dla metadanych klas. Jeśli dla MaxMetaspaceSize nie określono żadnej wartości, Metaspace zmienia jej rozmiar w czasie wykonywania zgodnie z wymaganiami aplikacji.
Gdy obszar metadanych klasy osiągnie wartość MaxMetaspaceSize, wyzwalany jest moduł Metaspace GC. Gdy występuje nadmierna liczba GC Metaspace, wskazuje to na wyciek pamięci klas, programów ładujących klasy itp., A także niewystarczającą wielkość.
Algorytmy czyszczenia pamięci w Javie
Wybieranie elementów bezużytecznych jest wykonywanych na różne sposoby. W tej sekcji przedstawimy cztery takie sposoby lub algorytmy garbage Collection w Javie.
Szeregowy GC
Serial GC to najprostszy algorytm GC. Działa głównie na małych stertach i systemach jednowątkowych. Podczas pracy Serial GC zawiesza wszystkie aplikacje.
Aby włączyć Serial GC, możemy użyć następującej opcji JVM.
jakie jest najlepsze usuwanie złośliwego oprogramowania
java –xx:+UseSerialGC –jar Application.java
Powyższe polecenie można podać w linii poleceń. Tutaj Application.java jest plikiem, dla którego ma być włączony szeregowy GC.
Przepustowość / Równoległy GC
Algorytm równoległego GC jest domyślnym algorytmem w JDK 8. Algorytm ten wykorzystuje wiele wątków do skanowania przestrzeni sterty i zagęszczania. Ten algorytm jest odpowiedni głównie dla aplikacji, które mogą obsługiwać przerwy w wątkach i optymalizować obciążenie procesora.
Jedną z wad równoległego GC jest to, że podczas wykonywania pomniejszego lub pełnego GC algorytm wstrzymuje wątki aplikacji.
Kolektor CMS
CMS oznacza „ Równoczesne przeglądanie znaków ”. Ten algorytm wykorzystuje wiele równoległy wątków do skanowania sterty ( znak ) w celu zidentyfikowania nieużywanych obiektów i recyklingu ( zamiatać ) im. Kolektor CMS ma tryb Stop-The-World (STW).
Kolektor przechodzi w tym trybie w dwóch scenariuszach:
- Gdy do obiektów należących do starej generacji można dotrzeć ze zmiennych statycznych lub punktów wejścia wątku. Tak więc ten tryb jest włączony podczas inicjalizacji początkowych oznaczeń korzeni.
- Gdy algorytm działa współbieżnie, aplikacja zmienia stan i wymusza na kolektorze cofnięcie się w celu upewnienia się, że zaznaczono poprawne obiekty.
Kolekcjoner CMS może jednak cierpieć z powodu „niepowodzeń promocji”. Więc czym jest awaria promocyjna? Jeśli obiekty z przestrzeni młodego pokolenia zostaną przeniesione do starego pokolenia, a kolekcjoner nie stworzył wystarczająco dużo miejsca na te obiekty w przestrzeni sterty starej generacji, wtedy promocja się nie powiedzie.
Aby zapobiec niepowodzeniom promocji, możemy udostępnić zbieraczowi więcej wątków w tle lub zapewnić starszej generacji większy rozmiar sterty.
Kolektor G1
Kolektor G1 to zbieracz „najpierw śmieci”. Jest przeznaczony do sterty o rozmiarze większym niż 4 GB. Na podstawie rozmiaru sterty dzieli rozmiar sterty na regiony o wielkości od 1 MB do 32 MB.
Kolektor G1 zaznacza obiekty w zależności od żywotności obiektów w hałdzie. Po tej fazie zaznaczania G1 jest świadomy pustych obszarów. W ten sposób zbiera nieosiągalne obiekty z tych obszarów, uwalniając w ten sposób dużą ilość miejsca. Dlatego nazywa się go Garbage-First, ponieważ najpierw zbiera regiony zawierające śmieci.
Spełnia również docelowy czas przerwy zdefiniowany przez użytkownika, używając modelu przewidywania pauzy, wybierając liczbę regionów do zebrania w zależności od określonego docelowego czasu wstrzymania.
Zaleta zbierania śmieci
- Garbage Collection sprawia, że zarządzanie pamięcią w Javie jest wydajne, ponieważ usuwa z pamięci sterty obiekty, do których nie istnieją odniesienia, bez ingerencji programisty.
- Ponieważ wyrzucanie elementów bezużytecznych jest automatyczne i jest częścią JVM, programista nie musi podejmować żadnych dodatkowych wysiłków, aby odzyskać pamięć lub zniszczyć obiekty.
- Programista nie musi pisać żadnego konkretnego kodu, aby cofnąć alokację pamięci i usunąć obiekty, jak to zrobiono w C / C ++.
Często Zadawane Pytania
P 1) Jaka jest rola zbieracza śmieci?
Odpowiedź: W Javie Garbage Collector jest główną stroną w zarządzaniu pamięcią i ma za zadanie zbieranie nieosiągalnych obiektów i odzyskiwanie pamięci.
P # 2) Co masz na myśli mówiąc o zbieraniu śmieci?
Odpowiedź: Wyrzucanie elementów bezużytecznych to technika automatycznego zarządzania pamięcią poprzez odzyskiwanie nieużywanej pamięci. Jest to funkcja obecna w językach programowania takich jak Java, dzięki której programiści nie muszą śledzić nieużywanych obiektów i ich niszczyć. Odbywa się to automatycznie za pomocą Garbage Collection.
Pytanie nr 3) Kto jest odpowiedzialny za Garbage Collection w Javie?
Odpowiedź: Za zarządzanie pamięcią w Javie odpowiada Garbage Collection.
Pytanie 4) Jak możemy zapobiec zbieraniu śmieci w Javie?
Odpowiedź: Ponieważ Garbage Collector nie odzyskuje pamięci zmiennych / obiektów, które są żywe, najlepszym sposobem zapobiegania wyrzucaniu elementów bezużytecznych jest używanie zmiennych / obiektów w całym programie.
Pytanie nr 5) Jak możesz upewnić się, że obiekt jest zbierany jako Garbage?
Odpowiedź: Obiekt kwalifikuje się do wyrzucania elementów bezużytecznych, gdy jest nieosiągalny, tj. Gdy nie ma już odwołań do obiektu. Chociaż nie możemy zmusić Garbage Collectora do uruchomienia kiedy tylko chcemy, zawsze możemy zażądać by działał używając System.gc ().
Wniosek
Zbieranie śmieci w Javie, o którym mówiliśmy w tym tutorialu, jest automatyczne i programista nie musi martwić się usuwaniem obiektów lub zmiennych zaalokowanych w programie.
Automatyczne usuwanie pamięci w Javie jest najważniejszą cechą języka i stanowi część zarządzania pamięcią w Javie.
Chociaż zbieranie elementów bezużytecznych jest wykonywane przez maszynę JVM i jest poza zasięgiem programisty, zawsze możemy zażądać uruchomienia modułu Garbage Collector przy użyciu metody gc () klasy System i Runtime.
W tym samouczku omówiliśmy proces finalizacji, który jest wykonywany przed zniszczeniem obiektów przez Garbage Collector. Omówiliśmy również proces usuwania pamięci w Javie. Na koniec omówiliśmy różne algorytmy używane przez Garbage Collectora.
To kończy naszą dyskusję o Garbage Collector w Javie.
=> Obejrzyj serię prostych szkoleń dotyczących języka Java.
rekomendowane lektury
- Podstawy języka Java: składnia języka Java, klasa języka Java i podstawowe pojęcia dotyczące języka Java
- Do czego służy Java: 12 rzeczywistych aplikacji Java
- Samouczek dotyczący ciągów Java | Metody ciągów Java z przykładami
- Samouczek JAVA dla początkujących: ponad 100 praktycznych samouczków wideo Java
- Komponenty Java: platforma Java, JDK, JRE i wirtualna maszyna Java
- Wdrażanie Java: tworzenie i wykonywanie pliku Java JAR
- Wirtualna maszyna Java: jak JVM pomaga w uruchamianiu aplikacji Java
- Samouczek dotyczący refleksji w języku Java z przykładami