Što je Java Garbage Collector?
Skupljač smeća je demonska nit koja oslobađa memoriju tijekom izvođenja. Skupljanje smeća može se izraziti i reciklažom pamćenja. Uglavnom se u JVM-u koristi oracle hotspot sakupljač smeća zbog svoje učinkovitosti. Područje memorije u JVM-u u kojem se stvaraju objekti naziva se heap. Hrpa je podijeljena na dva dijela:
- Prostor mlade generacije
- Stari / zatečeni generacijski prostor
Mlada generacija je opet podijeljena u 3 dijela
- Edenski prostor
- Survivor From
- Survivor To
U sljedećim točkama dano je dublje objašnjenje. Na primjer, ako ste stvorili predmemoriju u svom programu i ako je predmemorijski objekt preživio mnogo ciklusa GC-a, tada to prelazi u staru generaciju. GC traži predmete koji više nisu potrebni programu i uništava ih.
Zašto sakupljač smeća?
Prije Jave, dva su najpopularnija jezika bila C i C ++. U C smo naišli na calloc (), malloc (), realloc () koji će dodijeliti memoriju pufera, a u C ++ imamo destruktore. Sve ove funkcije su za značajku koja se zove upravljanje memorijom. Java nudi Garbage Collector kao automatsko upravljanje memorijom iz glavna dva razloga:
- Neki stvoreni predmeti postaju nedostupni
- Upućivanja starih objekata na mlade predmete postoje samo u malom broju.
Najbolja praksa za korištenje sakupljača smeća je postavljanje zastava na JVM.
Dopustite mi da vam dam primjer za nedostupne predmete
//class code
int i = 1;
if(i == 1)(
String s = abc;
System.out.println(s);
)
//class code
U gornjem primjeru, Java će stvoriti string objekt i opseg tog objekta je upravo u tome ako se blok ne može koristiti izvan. Stoga, kada sakupljanje smeća pređe preko te klase, označit će 's' nedostupnim i neiskorištenim objektom i izbrisati ga.
Funkcije u sakupljaču smeća
- Oznaka: Počinje od korijenskog čvora vaše aplikacije (glavne), hoda grafikonima objekata, označava predmete koji su dostižni kao život.
- Delete / Sweep: Brisanje nedostupnih objekata. Kad GC obriše predmete, stvara rupu u hrpi, čineći je nedosljednom. Tako se koristi sabijanje.
- Zbijanje: Kompaktirajte memoriju pomicanjem objekata i obilježavanjem raspodjele neprekidno od fragmentirane. To je dugotrajan zadatak.
Kako radi Java Garbage Collector?
- Postoje dvije vrste objekata:
Live Objects: Dostupno (reference iz drugog objekta)
Mrtvi objekti: Nedostupan (ne odnosi se nigdje)
- Svi novostvoreni predmeti stvoreni su u prostoru Edina (prostor mlade generacije).
- Nakon što se prostor Eden napuni, program minorGC () pokreće se u prostoru mlade generacije koji označava sve neiskorištene ili mrtve predmete i briše ih iz memorije.
- Predmeti koji su preživjeli ovaj GC ciklus bit će premješteni u Survivor From Space. Isti se postupak ponavlja i ovog puta, kada se predmeti premještaju iz prostora Edena u Survivor. Iz svemira, GC provjerava je li pun, mrtvi se objekti oslobađaju, a preživjeli su predmeti također premješteni u Survivor.
- Taj se postupak ponavlja i ako su neki predmeti preživjeli prag ne od GC ciklusa, ti su se objekti premjestili u prostor Stare generacije.
- U ovom scenariju, JVM pokreće funkciju majorGC () koja prolazi kroz čitav prostor gomile, identificira / označava neiskorištene (null ili dead) predmete i briše sve te objekte.
- Imajte na umu da brišući predmeti iz hrpe prostora stvorit će rupe u memoriji uzrokujući curenje memorije. Da bi se izbjegao takav scenarij Skupljač smeća provodi sabijanje memorijskog prostora
Primjeri sakupljača smeća na Javi
Primjer 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();
)
)
Izlaz:
Objekt
Objašnjenje gornjeg koda
- U gornjem kôdu dva objekta obj1 i obj2 usmjereni su na null pa su pohranjeni u Eden prostor s null i nereferenciranim vrijednostima
- Sustav gc () pozvat će demonsku nit sakupljanja smeća i oba objekta su izbrisana iz prostora.
Razlozi i nedostaci
Slijedi nekoliko prednosti i nedostataka Java Garbage Collector kako slijedi:
Pros za gc:
- Skupljanje smeća povećava efikasnost memorije jer će izbrisati sve neiskorištene i null predmete
- Skupljanje smeća automatski je proces, tako da programer možda neće voditi brigu o tome, jer se na drugim jezicima bez programera za odvoz smeća mora pobrinuti za neuhvatljiv problem s memorijom.
Slabosti gc-a:
- Skupljač smeća pokrenut će glavnu gc funkciju koja će se kretati kroz čitav prostor hrpe, čineći vaš program brzinu polako nekoliko sekundi.
- Ovaj će postupak trajati više vremena CPU-a.
- Ako radite na aplikaciji koja zahtjeva ogromnu memoriju, iskoristite JVM zastave.
- Ako je prostora hrpe puno i predmeti se ne mogu pomicati ili dodavati dalje, Java izbacuje grešku u memoriji što će usporiti cijelu aplikaciju i može prouzročiti curenje memorije.
Preporučeni članci
Ovo je vodič Što je Java Garbage Collector ?. Ovdje smo raspravljali o njegovom radu zajedno s funkcijama, primjerom, pro i kontra Java sakupljača smeća. Možete pogledati i sljedeće članke da biste saznali više -
- Konstruktor i destruktor na Javi
- Destruktor na Javi
- Izvedba C # i Java
- Što je JVM?