Co to jest Java Garbage Collector?
Garbage collector to wątek demona, który zwalnia pamięć podczas działania. Odśmiecanie można również wyrazić jako recykling pamięci. Przeważnie w JVM ze względu na swoją wydajność używany jest moduł śmieciowy hotspotu Oracle. Obszar pamięci w JVM, w którym tworzone są obiekty, nazywa się stertą. Kupa jest podzielona na dwie części:
- Przestrzeń młodego pokolenia
- Stara / dzierżawiona przestrzeń generacji
Młode pokolenie ponownie dzieli się na 3 części
- Przestrzeń Eden
- Survivor From
- Survivor To
Bardziej szczegółowe wyjaśnienie podano w następnych punktach. Na przykład, jeśli utworzyłeś pamięć podręczną w swoim programie i jeśli obiekt pamięci podręcznej przetrwał wiele cykli GC, trafia do starej generacji. GC szuka obiektów, które nie są już potrzebne programowi i niszczy je.
Dlaczego Garbage Collector?
Przed Javą dwa najpopularniejsze języki to C i C ++. W C natrafiliśmy na calloc (), malloc (), realloc (), które przydzielą pamięć buforową, aw C ++ mamy destruktory. Wszystkie te funkcje dotyczą funkcji zwanej zarządzaniem pamięcią. Java zapewnia Garbage Collector jako automatyczne zarządzanie pamięcią z dwóch głównych powodów:
- Niektóre utworzone obiekty stają się nieosiągalne
- Odniesienia ze starych obiektów do młodych obiektów istnieją tylko w niewielkiej liczbie.
Najlepszą praktyką korzystania z modułu wyrzucania elementów bezużytecznych jest ustawianie flag na JVM.
Dam ci przykład dla nieosiągalnych obiektów
//class code
int i = 1;
if(i == 1)(
String s = abc;
System.out.println(s);
)
//class code
W powyższym przykładzie Java utworzy obiekt łańcuchowy, a zakres tego obiektu jest taki, że jeśli blok nie może być używany na zewnątrz. Tak więc, gdy kolekcja śmieci zostanie uruchomiona w tej klasie, oznaczy 's' jako nieosiągalny i nieużywany obiekt i usunie go.
Funkcje w Garbage Collector
- Oznacz: Zaczyna od węzła głównego aplikacji (głównej), przechodzi po wykresie obiektów, zaznacza obiekty, które są osiągalne jako życie.
- Usuń / Wyciągnij: Usuń nieosiągalne obiekty. Gdy GC usuwa obiekty, tworzy dziurę w stercie, co powoduje niespójność. Zatem stosuje się zagęszczanie.
- Kompaktowanie: Kompaktuj pamięć, przemieszczając się wokół obiektów i zaznaczając przydział ciągły niż fragmentaryczny. To czasochłonne zadanie.
Jak działa Java Garbage Collector?
- Istnieją dwa typy obiektów:
Obiekty aktywne : osiągalne (odniesienia z innego obiektu)
Dead Objects: Unreachable (brak odniesienia z dowolnego miejsca)
- Wszystkie nowo utworzone obiekty są tworzone w przestrzeni Eden (przestrzeń Młodej Generacji).
- Gdy przestrzeń Eden zostanie zapełniona, program minorGC () działa na przestrzeni Young Generation, która zaznacza wszystkie nieużywane lub martwe obiekty i usuwa je z pamięci.
- Obiekty, które przeżyły ten cykl GC zostaną przeniesione do Survivor From space. Ten sam proces powtarza się i tym razem, gdy obiekty są przenoszone z kosmicznej Edenu do Ocalałego Z kosmosu, GC sprawdza, czy jest pełny, martwe obiekty są uwalniane, a ocalałe obiekty zostaną przeniesione również do Ocalonego.
- Proces ten powtarza się i jeśli niektóre obiekty przetrwały próg liczby cykli GC, obiekty te są przenoszone do przestrzeni Starej Generacji.
- W tym scenariuszu JVM uruchamia funkcję majorGC (), która działa przez całą przestrzeń sterty, identyfikuje / oznacza nieużywane (zerowe lub martwe) obiekty i zamiata wszystkie te obiekty.
- Pamiętaj, że zamiatanie obiektów z przestrzeni sterty spowoduje powstanie dziur w pamięci, powodując wyciek pamięci. Aby uniknąć takiego scenariusza Garbage collector implementuje zagęszczanie przestrzeni pamięci
Przykłady Garbage Collector w Javie
Przykład system.gc ():
class Demo (
public void finalize()(
System.out.println(“Object”);
)
public static void main(String args())(
Demo obj1 = new Demo();
Demo obj2 = new Demo();
obj1 = null;
obj2 = null;
System.gc();
)
)
Wynik:
Obiekt
Objaśnienie powyższego kodu
- W powyższym kodzie dwa obiekty obj1 i obj2 wskazują na null, więc są przechowywane w przestrzeni Eden z wartościami null i bez odniesień
- System gc () wywoła wątek demona zbierania elementów bezużytecznych i oba obiekty zostaną usunięte z przestrzeni.
Plusy i minusy
Poniżej przedstawiono niektóre zalety i wady Java Garbage Collector:
Zalety gc:
- Odśmiecanie zwiększa wydajność pamięci, ponieważ spowoduje usunięcie wszystkich nieużywanych i pustych obiektów
- Śmieciarka jest procesem automatycznym, więc programista może się tym nie zająć, ponieważ w innych językach bez śmieciarza programista musi zająć się nieuchwytnym problemem z pamięcią.
Wady gc:
- Garbage collector uruchomi główną funkcję gc, która będzie działać przez całą przestrzeń sterty, powodując powolne przyspieszenie programu o kilka sekund.
- Ten proces zajmie więcej czasu procesora, spowalniając system kodu.
- Jeśli pracujesz nad aplikacją wymagającą dużej pamięci, skorzystaj z dostępnych flag JVM.
- Jeśli przestrzeń sterty jest zapełniona, a obiektów nie można przesuwać ani dodawać dalej, wówczas Java wyrzuca błąd pamięci, co spowalnia całą aplikację i może powodować wycieki pamięci.
Polecane artykuły
To jest przewodnik po Czym jest Java Garbage Collector ?. Tutaj omawiamy jego działanie wraz z funkcjami, przykładami, zaletami i wadami modułu śmieciowego Java. Możesz także przejrzeć następujące artykuły, aby dowiedzieć się więcej -
- Constructor and Destructor w Javie
- Destructor w Javie
- Wydajność C # a Java
- Co to jest JVM?