what is garbage collection java
Acest tutorial explică ce este Garbage Collection în Java și cum funcționează Garbage Collector. De asemenea, veți afla despre algoritmi pentru colectarea deșeurilor:
Cititorii care au cunoștințe în C / C ++ trebuie să știe că este responsabilitatea programatorului să creeze și să șteargă obiectele din C / C ++.
Erori grave apar dacă programatorul uită să distrugă obiectele create. Acest lucru se datorează faptului că eșecul de a distruge obiectele poate provoca „ Fara memorie ”Erori, scurgeri de memorie etc.
Această situație este complet îngrijită în Java, deoarece nu este nevoie ca un programator să țină evidența obiectelor. Java se ocupă de distrugerea obiectelor pentru noi prin colectarea automată a gunoiului.
=> Vizitați aici pentru a afla Java de la zero.
Procesul prin care obiectele care nu mai sunt utilizate sunt eliminate din memoria heap se numește „Colecție de gunoi”. Tehnica de colectare a gunoiului face parte din gestionarea memoriei în Java.
Astfel, în Java, Garbage Collector distruge toate obiectele care nu mai sunt folosite.
Ce veți învăța:
- Ce este un colector de gunoi în Java?
- Cum funcționează colectarea deșeurilor în Java?
- Algoritmi de colectare a gunoiului în Java
- Concluzie
Ce este un colector de gunoi în Java?
Colecția de gunoi în Java este gestionată de un program numit Garbage Collector.
Garbage Collector poate fi definit ca un program care este utilizat pentru a gestiona memoria în mod automat prin gestionarea alocării obiectului.
Știm că în limbajul Java, noile obiecte sunt create și alocate memorie folosind noul operator. Memoria alocată unui obiect folosind un nou operator rămâne alocată până când referințele folosesc acest obiect.
De îndată ce referințele încetează să existe, memoria pe care o ocupă obiectul este recuperată. Java tratează apoi alocarea sau distrugerea obiectelor în mod automat și nu trebuie să distrugem în mod explicit obiectul.
Această tehnică este tehnica de colectare a gunoiului în Java, unde programatorii nu trebuie să gestioneze în mod explicit repartizarea obiectelor.
Rețineți că, dacă programele nu alocă memoria atunci când obiectele nu au nevoie de ea, în cele din urmă nu va mai rămâne memorie de alocat și programele se vor bloca. Această situație se numește o scurgere de memorie.
Colectorul de gunoi rulează întotdeauna în fundal pe un fir de demon. Garbage Collector este considerat cel mai bun exemplu al firului demonului.
Garbage Collector rulează intenționând să elibereze memoria heap. Face acest lucru prin distrugerea obiectelor care sunt „inaccesibile”.
Ce este un obiect „inaccesibil”?
Un obiect devine inaccesibil atunci când nu există nici măcar o referință asociată cu acesta.
Luați în considerare următoarea bucată de cod:
Integer ref_obj = new Integer (5); //ref_obj is a reference to Integer ref_obj = null; //Integer object now becomes unreachable
După cum se vede din codul de mai sus, un obiect este accesibil atâta timp cât o referință este asociată cu acesta. În momentul în care asocierea de referință este eliminată (o referință de setare la nul în cazul de mai sus) obiectul devine de neatins.
Când un obiect devine inaccesibil, acesta devine eligibil pentru Colectarea gunoiului (GC).
Cum putem face un obiect eligibil pentru GC?
Deși programatorului nu i se cere să distrugă obiectele, deoarece acestea sunt îngrijite de GC, cel puțin programatorul poate face aceste obiecte de neatins atunci când nu mai sunt necesare.
Făcând acest lucru, GC va colecta obiectele de neatins și le va distruge.
Există câteva modalități de a face un obiect eligibil pentru GC făcându-l inaccesibil.
Sunt:
# 1) Anulați referința
Având o referință atribuită unui obiect, dacă acest obiect nu mai este necesar, atunci atribuiți referința la nul.
Student s = new Student (); s = null;
Când s este setat la nul, obiectul Student devine inaccesibil.
# 2) Re-atribuiți referința
Acesta este un alt mod de a face obiectele eligibile pentru GC.
Luați în considerare următorul cod.
Student s1 = new Student (); Student s2 = new Student (); s1 = s2;
Acum, deoarece am atribuit s1 unui alt obiect, obiectul Student la care se face referire prin s1 este dereferențiat.
# 3) Creați un obiect anonim
Prin crearea unui obiect anonim putem face obiectele eligibile pentru GC.
Putem crea un obiect anonim așa cum se arată mai jos:
new Student();
Odată ce facem obiectele eligibile pentru GC, aceste obiecte pot sau nu să fie distruse imediat de GC. Acest lucru se datorează faptului că nu putem forța în mod explicit GC să execute așa cum și când dorim.
Când rulează colectorul de gunoi?
Depinde de JVM să ruleze programul Garbage Collector. Când JVM rulează Garbage Collector, obiectele inaccesibile sunt distruse. Dar totuși, nu putem garanta când va rula JVM.
Deși nu putem forța GC să execute, putem solicita foarte bine o colectare a gunoiului.
GC poate fi solicitat folosind oricare dintre următoarele metode.
# 1) System.gc (): Clasa System a Java oferă o metodă statică gc () folosind care putem solicita JVM să ruleze Garbage Collector.
# 2) Runtime.getRuntime (). Gc (): La fel ca System.gc (), putem folosi și metoda gc () din „Runtime class” pentru a solicita JVM să ruleze Garbage Collector.
Notă: Nu există nicio garanție că Garbage Collector va rula după o cerere din aceste două metode.
Finalizare
Finalizarea este efectuată de Garbage Collector chiar înainte de a distruge obiectele. Ca parte a tehnicii de finalizare, Garbage Collector apelează metoda finalize () pe obiect. Metoda finalize () este utilizată pentru a efectua activități de curățare.
Metoda finalize () este furnizată de clasa „Object” și are următorul prototip.
protected void finalize () throws Throwable
Metoda finalize () este invocată ori de câte ori obiectul este colectat la gunoi
Notă: Colectorul de gunoi colectează numai obiectele care sunt create folosind noul cuvânt cheie. Pentru alte obiecte, trebuie să folosim metoda finalize () pentru a efectua curățarea.
Programul de mai jos prezintă o colecție simplă de gunoi în Java.
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 } }
Ieșire
În programul de mai sus, am creat o clasă TestGC. În această clasă, am anulat metoda finalize (). Apoi, în clasa principală, creăm două obiecte din clasa TestGC. În primul rând, anulăm un obiect și apelăm System.gc () pentru a solicita Garbage Collector.
Apoi, anulăm al doilea obiect și apelăm metoda Runtime.getRuntime.gc () pentru a solicita Garbage Collector. Ieșirea arată metoda de finalizare de două ori, indicând astfel că Garbage Collector a funcționat de două ori.
Notă: Deși avem acest rezultat, nu este garantat că de fiecare dată vom obține același rezultat. Depinde complet de JVM.
Cum funcționează colectarea deșeurilor în Java?
În această secțiune, vom vedea cum funcționează Garbage Collection în Java.
În timpul colectării gunoiului, Garbage Collector caută memoria Heap și apoi „marchează” obiectele inaccesibile. Apoi îi distruge.
Dar problema apare atunci când numărul de obiecte crește. Pe măsură ce obiectele cresc, timpul necesar pentru colectarea gunoiului crește, de asemenea, pe măsură ce caută obiecte inaccesibile. Cu toate acestea, nu afectează prea mult, deoarece majoritatea obiectelor au o durată scurtă de viață.
Comportamentul de mai sus se numește „Colecția de deșeuri generațională” și ar trebui să îmbunătățească performanța JVM. În această abordare, întregul spațiu Heap este împărțit în - generația tânără, generația veche sau permanentă și generația permanentă.
# 1) Spațiul teanc de generație tânără: Toate noile obiecte sunt create în acest spațiu. Odată ce spațiul este plin, are loc GC Minor în care sunt distruse toate obiectele moarte. Procesul GC minor este rapid și rapid, deoarece majoritatea obiectelor sunt moarte. Obiectele care au supraviețuit tinerei generații sunt mutate la generațiile mai în vârstă.
# 2) Spațiu de grămadă de generație veche: Această generație stochează obiecte care supraviețuiesc mult timp. Când se atinge vârsta prag stabilită pentru tânăra generație, obiectul este mutat la generația veche. Când spațiul generației vechi este umplut, se efectuează un GC major.
GC major este lent, deoarece obiectele implicate aici sunt obiecte vii. Uneori, întregul spațiu Heap care include generații tinere, precum și vechi, este eliminat. Aceasta se numește „GC complet”.
# 3) Generatie permanenta L Până la Java 7 a existat o generație permanentă (Perm Gen). Metadatele deținute de Perm Gen au fost folosite de JVM. JVM a folosit aceste metadate pentru a descrie clasele și metodele utilizate în aplicație. Perm Gen a fost eliminat în Java 8.
Colecția de gunoi Java 8: Perm Gen și Metaspace
Am menționat deja despre spațiul Perm Gen care a fost prezent până la Java 7. Cu toate acestea, acum în Java 8, JVM reprezintă metadatele clasei folosind memoria nativă numită „Metaspace”.
În afară de Metaspace, există un nou flag denumit „MaxMetaspaceSize” care limitează memoria utilizată pentru metadatele clasei. Dacă nu este specificată nicio valoare pentru MaxMetaspaceSize, atunci Metaspace o redimensionează la runtime în funcție de cererea aplicației.
Când spațiul de metadate de clasă ajunge la MaxMetaspaceSize, Metaspace GC este declanșat. Când există Metaspace GC excesiv, acesta indică scurgeri de memorie de clase, clasificatoare etc., precum și dimensionare inadecvată.
Algoritmi de colectare a gunoiului în Java
Există diferite moduri în care se realizează Colecția de gunoi. În această secțiune, vom prezenta patru astfel de moduri sau algoritmi pentru colectarea deșeurilor în Java.
GC serial
Serial GC este cel mai simplu algoritm GC. Funcționează în principal pe dimensiuni mici de heap și sisteme cu un singur fir. În timp ce funcționează, Serial GC îngheță toate aplicațiile.
Pentru a activa Serial GC, putem folosi următoarea opțiune JVM.
cum să programați un computer pentru începători
java –xx:+UseSerialGC –jar Application.java
Comanda de mai sus poate fi dată în linia de comandă. Aici Application.java este un fișier pentru care GC serial trebuie activat.
Debit / GC paralel
Algoritmul GC paralel este cel implicit în JDK 8. Acest algoritm folosește mai multe fire pentru a scana spațiul heap și compactarea. Acest algoritm este potrivit mai ales pentru aplicații care pot gestiona pauzele firelor și pot optimiza overhead-ul procesorului.
Un dezavantaj al GC paralel este că, în timp ce se execută GC minor sau complet, algoritmul întrerupe firele de aplicații.
Colectorul CMS
CMS înseamnă „ Marcare concomitentă ”. Acest algoritm folosește multiple concurente fire pentru a scana grămada ( marcă ) pentru a identifica obiectele neutilizate și a le recicla ( mătura ) lor. Colectorul CMS are un mod Stop-The-World (STW).
Colectorul merge în acest mod în două scenarii:
- Când obiectele aparținând vechii generații pot fi atinse din variabile statice sau puncte de intrare a firului. Deci, acest mod este activat în timpul inițializării marcajelor inițiale rădăcină.
- Când algoritmul rulează simultan, aplicația schimbă starea și forțează colectorul să revină pentru a se asigura că obiectele corecte sunt marcate.
Cu toate acestea, colectorul CMS poate suferi „eșecuri de promovare”. Deci, ce este un eșec promoțional? Dacă obiectele din spațiul generației tinere sunt mutate în generația veche, iar colectorul nu a făcut suficient spațiu pentru aceste obiecte în spațiul heap al vechii generații, atunci va apărea un eșec promoțional.
Pentru a preveni eșecul promoțional, este posibil să oferim mai multe fire de fundal colecționarului sau să oferim mai multă dimensiune heap vechii generații.
Colectorul G1
Colectorul G1 este colectorul „Primul gunoi”. Este proiectat pentru dimensiuni de heap de peste 4 GB. Pe baza dimensiunii heap-ului, împarte dimensiunea heap-ului în regiuni de dimensiuni cuprinse între 1 MB și 32 MB.
Colectorul G1 marchează obiectele în funcție de vioiciunea obiectelor din toată grămada. După această fază de marcare, G1 este conștient de regiunile goale. Astfel colectează obiectele inaccesibile din aceste regiuni eliberând astfel o cantitate mare de spațiu. Prin urmare, este denumit Garbage-First, deoarece colectează mai întâi regiunile care conțin gunoi.
De asemenea, îndeplinește obiectivul de timp de pauză definit de utilizator, utilizând un model de predicție de pauză, selectând numărul de regiuni de colectat în funcție de obiectivul de timp de pauză specificat.
Avantajul colectării gunoiului
- Colecția de gunoi face ca gestionarea memoriei în Java să fie eficientă, deoarece elimină obiectele neriferențiate din memoria heap fără interferența programatorului.
- Deoarece colectarea gunoiului este automată și face parte din JVM, nu sunt necesare eforturi suplimentare din partea programatorului pentru a recupera memoria sau a distruge obiecte.
- Programatorul nu trebuie să scrie niciun cod specific pentru a aloca memoria și șterge obiectele așa cum se face în C / C ++.
întrebări frecvente
Q # 1) Care este rolul unui colector de gunoi?
Răspuns: În Java, Garbage Collector este partea principală în gestionarea memoriei și are sarcina de a colecta obiectele care nu pot fi accesate și de a recupera memoria.
Q # 2) Ce vrei să spui prin colectarea gunoiului?
Răspuns: Colectarea gunoiului este tehnica prin care memoria este gestionată automat prin recuperarea memoriei neutilizate. Este o caracteristică prezentă în limbaje de programare precum Java, datorită căreia programatorii nu trebuie să țină evidența obiectelor neutilizate și să le distrugă. Se face automat folosind Garbage Collection.
Q # 3) Cine este responsabil pentru colectarea deșeurilor în Java?
Răspuns: Gestionarea memoriei Java are responsabilitatea Garbage Collection.
Q # 4) Cum putem preveni colectarea deșeurilor în Java?
Răspuns: Deoarece Garbage Collector nu recuperează memoria variabilelor / obiectelor care sunt în viață, cel mai bun mod de a preveni colectarea gunoiului este să continuați să utilizați variabile / obiecte pe tot parcursul programului.
Q # 5) Cum vă puteți asigura că un obiect este colectat gunoi?
Răspuns: Un obiect este eligibil pentru colectarea deșeurilor atunci când este inaccesibil, adică atunci când nu se mai referă la obiect. Deși nu putem forța Garbage Collector să ruleze ori de câte ori dorim, îl putem solicita oricând să ruleze folosind System.gc ().
Concluzie
Colecția de gunoi în Java despre care am discutat în acest tutorial este automată, iar programatorul nu trebuie să se preocupe de ștergerea obiectelor sau variabilelor alocate în program.
Colectarea automată a gunoiului în Java este cea mai importantă caracteristică a limbajului și face parte din gestionarea memoriei în Java.
Deși Garbage Collection este realizat de JVM și nu este la îndemâna programatorului, putem solicita oricând Garbage Collector să ruleze folosind metoda gc () a clasei System și Runtime.
În acest tutorial, am discutat despre procesul de finalizare care se efectuează înainte ca obiectele să fie distruse de Garbage Collector. De asemenea, am discutat despre procesul de colectare a gunoiului în Java. În cele din urmă, am discutat despre diferiții algoritmi utilizați de Garbage Collector.
Acest lucru completează discuția noastră despre Garbage Collector în Java.
=> Urmăriți aici seria de antrenament Java simplă.
Lectură recomandată
- Noțiuni de bază Java: Sintaxă Java, Java Class și Core Java Concepts
- Pentru ce este folosit Java: 12 aplicații Java din lumea reală
- Tutorial Java String | Metode Java String cu exemple
- Tutorial JAVA pentru începători: peste 100 de tutoriale video Java practice
- Componente Java: platformă Java, JDK, JRE și mașină virtuală Java
- Implementarea Java: crearea și executarea fișierului Java JAR
- Mașină virtuală Java: Cum ajută JVM la rularea aplicației Java
- Tutorial de reflecție Java cu exemple