Ce este Java Garbage Collector?
Colectorul de gunoi este un fir de daemon care eliberează memorie în timpul perioadei de rulare. Colectarea gunoiului poate fi, de asemenea, exprimată ca reciclare a memoriei. În mare parte în JVM, oracle hotspot colector de gunoi este utilizat datorită eficienței sale. Zona de memorie din JVM unde sunt create obiectele se numește heap. Mormântul este împărțit în două părți:
- Spațiu de generație tânără
- Spațiu de generație veche / deținută
Tânăra generație este din nou împărțită în 3 părți
- Eden space
- Supraviețuitor din
- Supraviețuitorul
O explicație mai profundă a fost dată în următoarele puncte. De exemplu, dacă ați creat un cache în programul dvs. și dacă obiectul cache a supraviețuit multor cicluri GC, atunci trece în vechea generație. GC caută obiecte care nu mai sunt necesare de program și le distruge.
De ce colectoare de gunoi?
Înainte de Java, două dintre cele mai populare limbi erau C și C ++. În C am întâlnit calloc (), malloc (), realloc () care va aloca memorie tampon și în C ++ avem distrugători. Toate aceste funcții sunt destinate funcției numite managementul memoriei. Java oferă colectoarele de gunoi ca gestionare automată a memoriei din principalele două motive:
- Unele obiecte create devin de neatins
- Referințele de la obiecte vechi la obiecte tinere există doar în număr mic.
Cea mai bună practică pentru a utiliza un colector de gunoi este să setați steaguri pe JVM.
Permiteți-mi să vă dau un exemplu pentru obiecte care nu pot fi atinse
//class code
int i = 1;
if(i == 1)(
String s = abc;
System.out.println(s);
)
//class code
În exemplul de mai sus, Java va crea un obiect șir, iar obiectul obiectului este doar în cazul în care blocul nu poate fi utilizat în exterior. Astfel, atunci când colectarea gunoiului trece peste această clasă, aceasta va marca obiectul de neatins și neutilizat și îl va șterge.
Funcții în colectoare de gunoi
- Marcare: pornește de la nodul rădăcină al aplicației (principal), parcurge graficul obiectului, marchează obiecte care pot fi accesate ca viață.
- Șterge / mătura: Șterge obiecte care nu pot fi atinse Când GC șterge obiecte, creează o gaură în grămadă făcând-o inconsistentă. Astfel, se folosește compactarea.
- Compactarea: Compactarea memoriei deplasându-se în jurul obiectelor și marcând alocarea contiguă decât fragmentată. Este o sarcină care consumă timp.
Cum funcționează Java Garbage Collector?
- Există două tipuri de obiecte:
Obiecte vii: Reachable (referințe de la un alt obiect)
Obiecte moarte: neatinse (nu se face referire de nicăieri)
- Toate obiectele nou create sunt create în spațiul Eden (spațiul generației tinere).
- Odată ce spațiul Eden este plin, un program minorGC () rulează spațiul Young Generation, care marchează toate obiectele neutilizate sau moarte și le elimină din memorie.
- Obiectele care au supraviețuit acestui ciclu GC vor fi mutate în supraviețuitor din spațiu. Același proces se repetă și de data aceasta când obiectele sunt mutate din spațiul Eden în Supraviețuitor Din spațiu, GC verifică dacă este plin, obiectele moarte sunt eliberate și obiectele supraviețuite vor fi mutate și la Supraviețuitor.
- Acest proces se repetă și unele obiecte au supraviețuit unui prag fără cicluri GC, acele obiecte sunt mutate în spațiul Old Generation.
- În acest scenariu, JVM rulează funcția majorGC () care parcurge spațiu complet de grădină, identifică / marchează obiecte neutilizate (nule sau moarte) și mătura toate aceste obiecte.
- Amintiți-vă, măturarea obiectelor din spațiul acumulator va crea găuri în memorie, provocând o scurgere de memorie. Pentru a evita un astfel de scenariu, Colectorul de gunoi implementează compactarea spațiului de memorie
Exemple de gunoi Collector în Java
Exemplu de sistem.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();
)
)
ieşire:
Obiect
Explicarea codului de mai sus
- În codul de mai sus, cele două obiecte obj1 și obj2 sunt îndreptate spre nul, astfel încât acestea sunt stocate în spațiul Eden cu valori nule și nereferențiate
- System gc () va invoca un fir de demoni de colectare a gunoiului și ambele obiecte sunt șterse din spațiu.
Punctele pro și contra
Mai jos sunt câteva argumente pro și contra ale Garbage Collector Java după cum urmează:
Beneficiile gc:
- Colectarea gunoiului crește eficiența memoriei, deoarece va șterge toate obiectele neutilizate și nule
- Un colector de gunoi este un proces automat, astfel încât dezvoltatorul ar putea să nu aibă grijă de el, deoarece în alte limbi fără programator de colectoare de gunoi trebuie să aibă grijă de problema evazivă a memoriei.
Contra de gc:
- Colectorul de gunoi va rula funcția majoră de gc, care va parcurge întregul spațiu de grădină, ceea ce va face ca programul să se miște încet cu câteva secunde.
- Acest proces va dura mai mult timp pentru a face procesul de coduri mai lent.
- Dacă lucrați la o aplicație care necesită o memorie imensă, folosiți steagurile JVM disponibile.
- Dacă spațiul acumulator este plin și obiectele nu pot fi glisate sau adăugate în continuare, Java elimină eroarea de memorie, care va încetini întreaga aplicație și, de asemenea, poate provoca scurgeri de memorie.
Articole recomandate
Acesta este un ghid pentru Ce este Java Garbage Collector ?. Aici vom discuta despre funcționarea acestuia împreună cu funcții, exemplu, argumente pro și contra de colectoare de gunoi Java. De asemenea, puteți consulta următoarele articole pentru a afla mai multe -
- Constructor și distrugător în Java
- Distrugător în Java
- C # vs performanță Java
- Ce este JVM?