what is garbage collection java
Tento výukový program vysvětluje, co je Garbage Collection v Javě a jak funguje Garbage Collector. Dozvíte se také o Algoritmech pro Garbage Collection:
Čtenáři, kteří mají znalosti v C / C ++, si musí být vědomi, že je odpovědností programátora vytvářet a mazat objekty v C / C ++.
Pokud programátor zapomene zničit vytvořené objekty, nastanou vážné chyby. Důvodem je to, že pokud zničíte objekty, může to způsobit „ Nedostatek paměti „Chyby, úniky paměti atd.
O tuto situaci je v Javě zcela postaráno, protože není nutné, aby programátor sledoval objekty. Java se o nás stará o ničení objektů prostřednictvím automatického sběru odpadu.
=> Navštivte zde a dozvíte se Java od začátku.
Proces, při kterém jsou objekty, které se již nepoužívají, odstraněny z paměti haldy, se nazývá „Garbage Collection“. Technika sběru odpadu je součástí správy paměti v Javě.
V Javě tedy Garbage Collector ničí všechny objekty, které se již nepoužívají.
Co se naučíte:
- Co je sběratel odpadků v Javě?
- Jak funguje Garbage Collection v Javě?
- Algoritmy sběru odpadu v Javě
- Závěr
Co je sběratel odpadků v Javě?
Garbage Collection v Javě je spravován programem nazvaným Garbage Collector.
Garbage Collector lze definovat jako program, který se používá k automatické správě paměti zpracováním de-alokace objektu.
Víme, že v jazyce Java jsou nové objekty vytvářeny a přidělena paměť pomocí nového operátoru. Paměť přidělená objektu pomocí nového operátoru zůstává přidělena, dokud odkazy tento objekt nepoužívají.
Jakmile odkazy přestanou existovat, je uvolněna paměť, kterou objekt zabírá. Java poté zpracovává de-alokaci nebo zničení objektů automaticky a my nemusíme explicitně ničit objekt.
Tato technika je technikou Garbage Collection v Javě, kde programátoři nemusí explicitně zpracovávat deallocation objektů.
Všimněte si, že pokud programy nedealokují paměť, když ji objekty nepotřebují, nakonec nezbude žádná paměť k přidělení a programy se zhroutí. Této situaci se říká únik paměti.
Sběratel odpadků vždy běží na pozadí ve vlákně démona. Garbage Collector je považován za nejlepší příklad vlákna démona.
Garbage Collector běží s úmyslem uvolnit paměť haldy. Dělá to tak, že ničí objekty, které jsou „nedosažitelné“.
Co je to „nedosažitelný“ objekt?
Objekt se stane nedostupným, když k němu není přidružen ani jeden odkaz.
Zvažte následující část kódu:
Integer ref_obj = new Integer (5); //ref_obj is a reference to Integer ref_obj = null; //Integer object now becomes unreachable
Jak je patrné z výše uvedeného kódu, objekt je dosažitelný, pokud je s ním spojen odkaz. V okamžiku, kdy je referenční asociace odstraněna (ve výše uvedeném případě odkaz na nastavení null), se objekt stane nedostupným.
Když se objekt stane nedosažitelným, stane se způsobilým pro Garbage Collection (GC).
Jak můžeme učinit objekt vhodným pro GC?
Ačkoli programátor není povinen zničit objekty, protože se o ně postará GC, alespoň může programátor tyto objekty znepřístupnit, když již nejsou potřebné.
Tímto způsobem GC shromáždí nedosažitelné předměty a zničí je.
Existuje několik způsobů, jak učinit objekt vhodným pro GC tím, že je nedosažitelný.
Oni jsou:
# 1) Zrušte odkaz
Vzhledem k odkazu přiřazenému k objektu, pokud tento objekt již není potřeba, přiřaďte odkaz na null.
Student s = new Student (); s = null;
Když je s nastaveno na null, Student objekt se stane nedostupným.
# 2) Znovu přiřaďte odkaz
Toto je další způsob, jak zajistit, aby objekty byly způsobilé pro GC.
Zvažte následující kód.
Student s1 = new Student (); Student s2 = new Student (); s1 = s2;
Nyní, když jsme přiřadili s1 jinému objektu, je Student objekt, na který odkazuje s1, dereferencován.
# 3) Vytvořte anonymní objekt
Vytvořením anonymního objektu můžeme učinit objekty vhodnými pro GC.
Můžeme vytvořit anonymní objekt, jak je znázorněno níže:
new Student();
Jakmile uděláme objekty způsobilé pro GC, tyto objekty mohou nebo nemusí být okamžitě zničeny GC. Je to proto, že nemůžeme explicitně přinutit GC vykonávat, kdykoli chceme.
Kdy běží sběratel odpadků?
Je na JVM, aby spustil program Garbage Collector. Když JVM spustí Garbage Collector, jsou nedosažitelné objekty zničeny. Přesto nemůžeme zaručit, kdy bude JVM spuštěn.
I když nemůžeme GC přinutit k provedení, můžeme velmi dobře požádat o Garbage Collection.
O GC lze požádat některou z následujících metod.
# 1) System.gc (): Třída System v Javě poskytuje statickou metodu gc (), pomocí které můžeme požádat JVM o spuštění Garbage Collector.
# 2) Runtime.getRuntime (). Gc (): Stejně jako System.gc () můžeme také použít metodu gc () „třídy Runtime“ k vyžádání JVM ke spuštění Garbage Collector.
Poznámka: Neexistuje žádná záruka, že Garbage Collector bude spuštěn po požadavku z těchto dvou metod.
Dokončení
Finalizaci provádí Garbage Collector těsně před zničením objektů. Jako součást finalizační techniky volá Garbage Collector metodu finalize () na objektu. Metoda finalize () se používá k provádění činností čištění.
Metoda finalize () je poskytována třídou „Object“ a má následující prototyp.
protected void finalize () throws Throwable
Metoda finalize () je vyvolána vždy, když je objekt smeten
Poznámka: Garbage collector shromažďuje pouze objekty, které jsou vytvořeny pomocí nového klíčového slova. U ostatních objektů musíme k provedení čištění použít metodu finalize ().
Níže uvedený program ukazuje jednoduchou Garbage Collection v Javě.
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 } }
Výstup
Ve výše uvedeném programu jsme vytvořili třídu TestGC. V této třídě jsme přepsali metodu finalize (). Pak v hlavní třídě vytvoříme dva objekty třídy TestGC. Nejprve zrušíme platnost objektu a zavoláme System.gc () a požádáme o Garbage Collector.
Dále zrušíme druhý objekt a zavoláme metodu Runtime.getRuntime.gc () a požádáme o Garbage Collector. Výstup ukazuje výstup metody finalizace dvakrát, což znamená, že Garbage Collector běžel dvakrát.
Poznámka: Ačkoli máme tento výstup, není zaručeno, že pokaždé získáme stejný výstup. Zcela záleží na JVM.
Jak funguje Garbage Collection v Javě?
V této části uvidíme, jak Garbage Collection funguje v Javě.
Během sběru odpadků vyhledá Garbage Collector paměť haldy a poté „označí“ nedosažitelné objekty. Pak je to zničí.
Problém však nastává, když se počet objektů zvyšuje. Jak se objekty zvětšují, čas potřebný pro Garbage Collection se také zvyšuje, protože vyhledává nedosažitelné objekty. Ovlivňuje to však příliš málo, protože většina objektů má krátkou životnost.
Chování výše se nazývá „Generační sběr odpadu“ a má zlepšit výkon JVM. V tomto přístupu je celý prostor haldy rozdělen na - Young Generation, Old or Tenured Generation a Permanent Generation.
# 1) Haldy mladé generace: V tomto prostoru jsou vytvořeny všechny nové objekty. Jakmile je prostor plný, proběhne Minor GC, ve kterém jsou zničeny všechny mrtvé objekty. Malý proces GC je rychlý a rychlý, protože většina objektů je mrtvá. Předměty, které přežily mladou generaci, jsou přesunuty do starších generací.
# 2) Haldy staré generace: Tato generace ukládá objekty, které přežijí dlouho. Když je splněn prahový věk nastavený pro mladou generaci, objekt se přesune do staré generace. Když je prostor staré generace zaplněn, provede se hlavní GC.
Major GC je pomalý, protože zde zapojené objekty jsou živé objekty. Někdy je celý prostor haldy, který zahrnuje mladé i staré generace, vyčištěn. Toto se nazývá „Full GC“.
# 3) Trvalá generace Dokud v Javě 7 nebyla Permanent Generation (Perm Gen). Metadata držená v Perm Gen byla používána JVM. JVM použila tato metadata k popisu tříd a metod použitých v aplikaci. Perm Gen byl odstraněn v Javě 8.
Java 8 Garbage Collection: Perm Gen a Metaspace
Již jsme se zmínili o prostoru Perm Gen, který byl přítomen do prostředí Java 7. Avšak nyní v prostředí Java 8 představuje JVM metadata třídy pomocí nativní paměti zvané „Metaspace“.
Kromě Metaspace existuje nový příznak s názvem „MaxMetaspaceSize“, který omezuje paměť používanou pro metadata třídy. Pokud pro MaxMetaspaceSize není zadána žádná hodnota, změní jej Metaspace za běhu podle požadavku aplikace.
Když prostor metadat třídy dosáhne MaxMetaspaceSize, spustí se Metaspace GC. Když je nadměrný Metaspace GC, znamená to únik paměti tříd, třídních nakladačů atd., Stejně jako nedostatečné dimenzování.
Algoritmy sběru odpadu v Javě
Existuje několik způsobů, jak se provádí Garbage Collection. V této části představíme čtyři takové způsoby nebo algoritmy pro Garbage Collection v Javě.
Sériové GC
Sériový GC je nejjednodušší algoritmus GC. Funguje hlavně na malých velikostech haldy a systémech s jedním vláknem. Během práce Serial GC zmrazí všechny aplikace.
Chcete-li zapnout Serial GC, můžeme použít následující volbu JVM.
oracle pl sql rozhovor otázky a odpovědi
java –xx:+UseSerialGC –jar Application.java
Výše uvedený příkaz lze zadat v příkazovém řádku. Zde je Application.java soubor, pro který má být povolen sériový GC.
Propustnost / paralelní GC
Algoritmus paralelního GC je výchozí v JDK 8. Tento algoritmus používá více vláken ke skenování prostoru haldy a zhutnění. Tento algoritmus je vhodný hlavně pro aplikace, které zvládnou pauzy vláken a optimalizují režii CPU.
Jednou nevýhodou paralelního GC je, že při provádění malého nebo úplného GC algoritmus pozastavuje vlákna aplikace.
Sběratel CMS
CMS znamená „ Souběžný Mark Sweep “. Tento algoritmus využívá více souběžně vlákna pro skenování haldy ( označit ) k identifikaci nepoužívaných předmětů a recyklaci ( zametat ) je. Sběratel CMS má režim Stop-The-World (STW).
Sběratel jde v tomto režimu ve dvou scénářích:
- Když lze k objektům patřícím ke staré generaci dosáhnout ze statických proměnných nebo vstupních bodů vlákna. Tento režim je tedy zapnutý během inicializace počátečních značek kořenů.
- Když je algoritmus spuštěn souběžně, aplikace změní stav a vynutí, aby se kolektor vrátil zpět, aby se ujistil, že jsou označeny správné objekty.
Sběratel CMS však může trpět „selháním propagace“. Co je tedy propagační neúspěch? Pokud jsou objekty z prostoru mladé generace přesunuty do staré generace a kolektor nevytvořil dostatek místa pro tyto objekty v prostoru haldy staré generace, dojde k chybě propagace.
Abychom zabránili selhání propagace, můžeme poskytnout více podprocesů na pozadí sběrateli nebo poskytnout větší velikost haldy staré generaci.
Sběratel G1
Sběratel G1 je sběratelem „Garbage-First“. Je určen pro hromady větších než 4 GB. Na základě velikosti haldy rozděluje velikost haldy na oblasti velikostí od 1 MB do 32 MB.
Sběratel G1 označuje objekty v závislosti na živosti objektů v celé haldě. Po této fázi značení si G1 je vědom prázdných oblastí. Tak shromažďuje nedosažitelné objekty z těchto oblastí, čímž uvolňuje velké množství prostoru. Proto je pojmenován jako Garbage-First, protože nejprve sbírá oblasti obsahující odpadky.
Rovněž splňuje uživatelem definovaný časový limit pozastavení pomocí modelu predikce pozastavení výběrem počtu oblastí, které se mají shromažďovat v závislosti na zadaném cílovém časovém limitu.
Výhoda odvozu odpadu
- Garbage Collection zefektivňuje správu paměti v Javě, protože bez zásahu programátora odstraňuje z haldy neodkazyované objekty.
- Jelikož Garbage collection je automatický a je součástí JVM, programátor nevyžaduje žádné další úsilí, aby znovu získal paměť nebo zničil objekty.
- Programátor nemusí psát žádný konkrétní kód k de-alokaci paměti a mazání objektů, jak to dělá v C / C ++.
Často kladené otázky
Otázka č. 1) Jaká je role Garbage Collector?
Odpovědět: V Javě je Garbage Collector hlavní stranou ve správě paměti a má za úkol shromažďovat nedosažitelné objekty a získat zpět paměť.
Otázka č. 2) Co myslíte tím Garbage Collection?
Odpovědět: Garbage collection je technika, při které se paměť spravuje automaticky opětovným získáním nevyužité paměti. Jedná se o vlastnost přítomnou v programovacích jazycích, jako je Java, kvůli níž programátoři nemusí sledovat nepoužívané objekty a ničit je. Dělá se to automaticky pomocí Garbage Collection.
Otázka č. 3) Kdo je zodpovědný za Garbage Collection v Javě?
Odpovědět: Za správu paměti Java odpovídá Garbage Collection.
Otázka č. 4) Jak můžeme zabránit Garbage Collection v Javě?
Odpovědět: Jelikož Garbage Collector neobnovuje paměť proměnných / objektů, které jsou naživu, nejlepším způsobem, jak zabránit Garbage Collection, je používat proměnné / objekty v celém programu.
Otázka č. 5) Jak můžete zajistit, aby byl objekt shromažďován Garbage?
Odpovědět: Objekt je způsobilý pro Garbage Collection, když je nedosažitelný, tj. Když na objekt neodkazují žádné další odkazy. I když nemůžeme přinutit Garbage Collector, aby běžel kdykoli chceme, můžeme ho kdykoli požádat o spuštění pomocí System.gc ().
Závěr
Garbage Collection v Javě, o kterém jsme diskutovali v tomto tutoriálu, je automatický a programátor se nemusí starat o mazání objektů nebo proměnných přidělených v programu.
Automatický sběr odpadu v Javě je nejdůležitější funkcí jazyka a je součástí správy paměti v Javě.
Ačkoli Garbage Collection provádí JVM a je mimo dosah programátora, můžeme kdykoli požádat Garbage Collector o spuštění pomocí metody gc () třídy System and Runtime.
V tomto kurzu jsme diskutovali o procesu finalizace, který se provádí před zničením objektů Garbage Collector. Také jsme diskutovali o procesu Garbage Collection v Javě. Nakonec jsme diskutovali o různých algoritmech, které používá Garbage Collector.
Tím je naše diskuse o Garbage Collector v Javě dokončena.
=> Dávejte pozor na jednoduchou sérii školení Java zde.
Doporučené čtení
- Základy jazyka Java: Syntaxe jazyka Java, třída Java a základní koncepty Java
- K čemu se Java používá: 12 reálných aplikací Java
- Výukový program Java String | Metody řetězců Java s příklady
- Výukový program JAVA pro začátečníky: 100+ praktických výukových programů Java Video
- Komponenty Java: Platforma Java, JDK, JRE a Java Virtual Machine
- Implementace Java: Vytvoření a spuštění souboru Java JAR
- Virtuální stroj Java: Jak JVM pomáhá při spouštění aplikace Java
- Výukový program Java Reflection s příklady