what is garbage collection java
Ovaj vodič objašnjava što je prikupljanje smeća u Javi i kako funkcionira Sakupljač smeća. Također ćete naučiti o algoritmima za sakupljanje smeća:
Čitatelji koji poznaju C / C ++ moraju biti svjesni da je odgovornost programera stvaranje i brisanje objekata u C / C ++.
Ozbiljne pogreške nastaju ako programer zaboravi uništiti stvorene objekte. To je zato što neuspjeh uništenja predmeta može prouzročiti „ Bez memorije ”Pogreške, curenje memorije itd.
Ova je situacija u potpunosti riješena na Javi jer nije potrebno da programer vodi evidenciju o objektima. Java se brine za uništavanje predmeta za nas automatskim odvozom smeća.
=> Posjetite ovdje da biste naučili Javu ispočetka.
Proces kojim se objekti koji se više ne koriste uklanjaju iz memorije hrpe naziva se 'Skupljanje smeća'. Tehnika prikupljanja smeća dio je upravljanja memorijom na Javi.
Tako u Javi Sakupljač smeća uništava sve objekte koji se više ne koriste.
Što ćete naučiti:
- Što je skupljač smeća u Javi?
- Kako prikupljanje smeća funkcionira na Javi?
- Algoritmi sakupljanja smeća u Javi
- Zaključak
Što je skupljač smeća u Javi?
Sakupljanjem smeća u Javi upravlja program nazvan Garbage Collector.
Sakupljač smeća može se definirati kao program koji se koristi za automatsko upravljanje memorijom rukovanjem de-alokacijom objekta.
Znamo da se u Java jeziku stvaraju novi objekti i dodjeljuje im memorija pomoću novog operatora. Memorija dodijeljena objektu pomoću novog operatora ostaje dodijeljena dok reference ne koriste ovaj objekt.
Čim reference prestanu postojati, memorija koju objekt zauzima se vraća. Java tada automatski rješava pitanje raspodjele ili uništavanja objekata i ne moramo izričito uništavati objekt.
Ova tehnika je tehnika prikupljanja smeća na Javi gdje programeri ne moraju izričito rješavati problem uklanjanja objekata.
Imajte na umu da ako programi ne dodijele memoriju kada objekti to ne trebaju, na kraju neće ostati memorije za dodjelu i programi će se srušiti. Ta se situacija naziva curenjem memorije.
Sakupljač smeća uvijek radi u pozadini na demonskom niti. Sakupljač smeća smatra se najboljim primjerom demonske niti.
Garbage Collector radi s namjerom da oslobodi hrpu memorije. To čini uništavanjem predmeta koji su „nedostižni“.
Što je „nedostižni“ objekt?
Predmet postaje nedostižan kad s njim nije povezana niti jedna referenca.
Razmotrite sljedeći dio koda:
Integer ref_obj = new Integer (5); //ref_obj is a reference to Integer ref_obj = null; //Integer object now becomes unreachable Kao što se vidi iz gornjeg koda, objekt je dostupan sve dok je s njim povezana referenca. Onog trenutka kada se ukloni referentna asocijacija (postavljanje reference na nulu u gore navedenom slučaju) objekt postaje nedostupan.
Kad objekt postane nedostupan, postaje prihvatljiv za Skupljanje smeća (GC).
Kako možemo učiniti objekt prihvatljivim za GC?
Iako programer ne mora uništavati objekte jer se o njima brine GC, barem programer može učiniti te objekte nedostupnima kad više nisu potrebni.
Čineći to, GC će prikupiti nedostižne predmete i uništiti ih.
Postoje neki načini kako objekt učiniti prihvatljivim za GC čineći ga nedostižnim.
Oni su:
# 1) Poništi referencu
S obzirom na referencu dodijeljenu objektu, ako taj objekt više nije potreban, dodijelite referencu nuli.
Student s = new Student (); s = null; Kada je s postavljeno na nulu, objekt Student postaje nedostupan.
# 2) Ponovno dodijelite Referencu
Ovo je još jedan način da objekti postanu prihvatljivi za GC.
Razmotrite sljedeći kod.
Student s1 = new Student (); Student s2 = new Student (); s1 = s2; Sada smo dodijelili s1 drugom objektu, preusmjeren je objekt Student na koji se poziva s1.
# 3) Stvorite anonimni objekt
Stvaranjem anonimnog objekta možemo objekte učiniti prihvatljivima za GC.
Možemo stvoriti anonimni objekt kao što je prikazano dolje:
new Student();Nakon što objekte prihvatimo za GC, GC ih može ili ne mora uništiti odmah. To je zato što ne možemo izričito prisiliti GC da izvršava kako i kada želimo.
Kada radi Sakupljač smeća?
Na JVM-u je pokrenuti program Skupljanje smeća. Kada JVM pokrene Sakupljač smeća, nedostupni objekti se uništavaju. Ali ipak, ne možemo jamčiti kada će JVM raditi.
Iako ne možemo prisiliti GC na izvršenje, vrlo dobro možemo zatražiti odvoz smeća.
GC se može zatražiti pomoću bilo koje od sljedećih metoda.
# 1) System.gc (): Klasa System Java nudi statičku metodu gc () pomoću koje možemo zatražiti od JVM-a da pokrene Garbage Collector.
# 2) Runtime.getRuntime (). Gc (): Poput System.gc (), također možemo koristiti gc () metodu “Runtime class” kako bismo zatražili od JVM-a pokretanje kolektora smeća.
Bilješka: Ne postoji jamstvo da će se Sakupljač smeća pokrenuti nakon zahtjeva ove dvije metode.
Finalizacija
Finalizaciju vrši Garbage Collector neposredno prije uništavanja predmeta. Kao dio tehnike finalizacije, Skupljač smeća poziva metodu finalize () na objektu. Metoda finalize () koristi se za obavljanje aktivnosti čišćenja.
Metodu finalize () pruža klasa “Object” i ima sljedeći prototip.
protected void finalize () throws Throwable Poziva se metoda finalize () kad god se objekt sakuplja smeće
Bilješka: Sakupljač smeća prikuplja samo objekte stvorene pomoću nove ključne riječi. Za ostale objekte moramo koristiti metodu finalize () da bismo izveli čišćenje.
Program u nastavku prikazuje jednostavno prikupljanje smeća na Javi.
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 } }Izlaz

U gore navedenom programu stvorili smo klasu TestGC. U ovoj smo klasi nadjačali metodu finalize (). Zatim u glavnoj klasi kreiramo dva objekta klase TestGC. Prvo poništavamo objekt i pozivamo System.gc () da zatražimo Sakupljač smeća.
Dalje, poništavamo drugi objekt i pozivamo metodu Runtime.getRuntime.gc () da bismo zatražili skupljač smeća. Izlaz dvaput prikazuje izlaz metode finaliziranja, pokazujući tako da je Sakupljač smeća dva puta izvodio.
Bilješka: Iako imamo ovaj izlaz, nije zajamčeno da ćemo svaki put dobiti isti izlaz. To u potpunosti ovisi o JVM-u.
Kako prikupljanje smeća funkcionira na Javi?
U ovom ćemo odjeljku vidjeti kako prikupljanje smeća radi na Javi.
Tijekom sakupljanja smeća, Skupljač smeća pretražuje hrpu memorije, a zatim 'označava' nedostupne predmete. Tada ih uništava.
Ali problem nastaje kad se broj predmeta povećava. Kako se predmeti povećavaju, vrijeme potrebno za prikupljanje smeća također se povećava dok se traže nedostižni predmeti. Međutim, to ne utječe previše jer većina predmeta ima kratak životni vijek.
Poziva se gore navedeno ponašanje “Generacijsko sakupljanje smeća” i trebao bi poboljšati performanse JVM-a. U ovom se pristupu cijeli prostor hrpe dijeli na - mladu generaciju, staru ili stambenu generaciju i trajnu generaciju.
# 1) Prostor hrpe mlade generacije: Svi novi objekti su stvoreni u ovom prostoru. Nakon što se prostor popuni, odvija se Minor GC u kojem se svi mrtvi predmeti uništavaju. Mali GC postupak je brz i brz jer je većina predmeta mrtva. Predmeti koji su preživjeli mladu generaciju premještaju se u starije generacije.
# 2) Prostor hrpe stare generacije: Ova generacija pohranjuje predmete koji dugo opstaju. Kad se dosegne prag dobi postavljen za mladu generaciju, objekt se premješta u staru generaciju. Kada se popuni prostor stare generacije, izvodi se glavni GC.
Glavni GC je spor jer su ovdje uključeni objekti živi objekti. Ponekad se čisti čitav Heap prostor koji uključuje mlade, ali i stare generacije. To se naziva 'Full GC'.
# 3) Trajna generacijaL Do Jave 7 nekada je postojala trajna generacija (Perm Gen). JVM je koristio metapodatke koji se čuvaju u Permu. JVM je koristio ove metapodatke za opis klasa i metoda korištenih u aplikaciji. Perm Gen uklonjen je u Javi 8.
Prikupljanje smeća Java 8: Perm Gen i Metaspace
Već smo spomenuli prostor Perm Gen koji je bio prisutan do Jave 7. Međutim, sada u Javi 8, JVM predstavlja metapodatke klase koristeći matičnu memoriju nazvanu 'Metaspace'.
Osim Metaspacea, postoji nova zastava nazvana 'MaxMetaspaceSize' koja ograničava memoriju koja se koristi za metapodatke klase. Ako za MaxMetaspaceSize nije navedena vrijednost, tada će je Metaspace promijeniti veličinu za vrijeme izvođenja prema zahtjevu aplikacije.
Kada prostor metapodataka klase dosegne MaxMetaspaceSize, aktivira se Metaspace GC. Kada postoji pretjerani Metaspace GC, to ukazuje na curenje memorije klasa, učitavača razreda, itd., Kao i na neadekvatno dimenzioniranje.
Algoritmi sakupljanja smeća u Javi
Postoje različiti načini na koji se obavlja prikupljanje smeća. U ovom ćemo odjeljku predstaviti četiri takva načina ili algoritma za prikupljanje smeća u Javi.
Serijski GC
Serijski GC je najjednostavniji GC algoritam. Uglavnom radi na malim veličinama hrpe i sustavima s jednim navojem. Tijekom rada, Serial GC zamrzava sve aplikacije.
Da bismo uključili Serial GC, možemo koristiti sljedeću JVM opciju.
nove značajke u javi 8 s primjerima
java –xx:+UseSerialGC –jar Application.javaGornja naredba može se dati u naredbenom retku. Ovdje je Application.java datoteka za koju treba omogućiti serijski GC.
Propusnost / paralelni GC
Paralelni GC algoritam zadani je u JDK 8. Ovaj algoritam koristi više niti za skeniranje prostora hrpe i zbijanje. Ovaj je algoritam prikladan uglavnom za aplikacije koje se mogu nositi s pauzama niti i optimizirati troškove procesora.
Jedan nedostatak paralelnog GC-a je taj što tijekom izvođenja manjeg ili cjelovitog GC-a algoritam pauzira niti aplikacije.
Sakupljač CMS-a
CMS je kratica za „ Istodobni Mark Sweep '. Ovaj algoritam koristi višestruko istovremeno niti za skeniranje hrpe ( ocjena ) za identificiranje neiskorištenih predmeta i recikliranje ( pomesti ) njima. Sakupljač CMS-a ima način Stop-The-World (STW).
Sakupljač ide u ovaj način rada u dva scenarija:
- Kada se do objekata koji pripadaju staroj generaciji može doći iz statičkih varijabli ili iz ulaznih točaka niti. Dakle, ovaj je način uključen tijekom inicijalizacije početnih oznaka korijena.
- Kad se algoritam istodobno izvodi, aplikacija mijenja stanje i prisiljava sakupljač da se vrati kako bi bio siguran da su označeni ispravni objekti.
Međutim, sakupljač CMS-a može patiti od 'neuspjeha promocije'. Dakle, što je promotivni neuspjeh? Ako se objekti iz prostora mlade generacije premjeste u staru generaciju, a sakupljač nije napravio dovoljno prostora za te objekte u prostoru hrpe stare generacije, tada će nastupiti promotivni neuspjeh.
Da bismo spriječili promotivni neuspjeh, sakupljaču možemo pružiti više pozadinskih niti ili starijoj generaciji pružiti veću veličinu hrpe.
Sakupljač G1
Sakupljač G1 je sakupljač 'Prvo smeće'. Dizajniran je za hrpe veće od 4 GB. Na temelju veličine hrpe, on dijeli veličinu hrpe na područja veličine od 1 MB do 32 MB.
Sakupljač G1 označava predmete ovisno o živosti predmeta na čitavoj hrpi. Nakon ove faze obilježavanja, G1 je svjestan praznih područja. Tako prikuplja nedostupne predmete iz ovih regija oslobađajući tako veliku količinu prostora. Stoga je nazvan Prvo smeće, jer prvo sakuplja regije u kojima se nalazi smeće.
Također ispunjava korisnički definirano ciljno vrijeme stanke, koristeći model predviđanja stanke, odabirom broja regija za prikupljanje, ovisno o navedenom cilju vremena pauze.
Prednost odvoza smeća
- Skupljanje smeća čini upravljanje memorijom u Javi učinkovito jer uklanja nereferencirane predmete iz gomile memorije bez uplitanja programera.
- Budući da je prikupljanje smeća automatsko i dio je JVM-a, programer ne treba dodatne napore da povrati memoriju ili uništi predmete.
- Programer ne mora pisati bilo koji određeni kôd da bi dodijelio memoriju i izbrisao objekte kao što je to učinjeno u C / C ++.
Često postavljana pitanja
P # 1) Koja je uloga sakupljača smeća?
Odgovor: U Javi je Skupljanje smeća glavna strana u upravljanju memorijom i ima zadatak prikupljati nedostupne predmete i povratiti memoriju.
P # 2) Što mislite pod skupljanjem smeća?
Odgovor: Skupljanje smeća je tehnika kojom se memorijom automatski upravlja povratom neiskorištene memorije. To je značajka prisutna u programskim jezicima poput Jave, zbog čega programeri ne moraju pratiti neiskorištene objekte i uništavati ih. Radi se automatski pomoću Skupljanja smeća.
3. pitanje) Tko je odgovoran za prikupljanje smeća na Javi?
Odgovor: Upravljanje memorijom Java odgovorno je za Skupljanje smeća.
P # 4) Kako možemo spriječiti prikupljanje smeća na Javi?
Odgovor: Budući da Skupljač smeća ne vraća memoriju živih varijabli / objekata, najbolji način da se spriječi Skupljanje smeća jest da se i dalje koriste varijable / objekti u cijelom programu.
5. pitanje) Kako možete biti sigurni da se neki predmet sakuplja smeće?
Odgovor: Objekt ispunjava uvjete za prikupljanje smeća kada je nedostupan, tj. Kada se na objekt više ne odnosi referenca. Iako ne možemo prisiliti Skupljač smeća da se pokrene kad god želimo, uvijek možemo zatražiti da se pokreće pomoću System.gc ().
Zaključak
Prikupljanje smeća u Javi o kojem smo govorili u ovom vodiču je automatsko i programer se ne mora brinuti oko brisanja objekata ili varijabli dodijeljenih u programu.
Automatsko prikupljanje smeća na Javi najvažnija je značajka jezika i dio je upravljanja memorijom u Javi.
Iako prikupljanje smeća izvodi JVM i izvan je dosega programera, uvijek možemo zatražiti da se skupljač smeća pokrene metodom gc () klase System and Runtime.
U ovom uputstvu raspravljali smo o procesu finalizacije koji se izvodi prije nego što objekte uništi Garbage Collector. Također smo razgovarali o procesu sakupljanja smeća na Javi. Na kraju smo razgovarali o različitim algoritmima koje koristi Skupljač smeća.
Ovim je završena naša rasprava o Sakupljaču smeća u Javi.
=> Ovdje pripazite na jednostavnu seriju Java treninga.
Preporučena literatura
- Osnove Java: Java sintaksa, Java klasa i osnovni koncepti Java
- Za što se koristi Java: 12 Java aplikacija u stvarnom svijetu
- Java String Vodič | Metode Java niza s primjerima
- JAVA Tutorial za početnike: 100+ praktičnih Java Video tutorijala
- Java komponente: Java platforma, JDK, JRE i Java virtualni stroj
- Implementacija Jave: Izrada i izvršavanje Java JAR datoteke
- Java virtualni stroj: kako JVM pomaže u pokretanju Java aplikacije
- Java Vodič za refleksiju s primjerima