what is garbage collection java
Tento výukový program vysvetľuje, čo je Garbage Collection v Jave a ako funguje Garbage Collector. Dozviete sa tiež o Algoritmoch pre zber odpadu:
Čitatelia, ktorí majú znalosti v C / C ++, si musia byť vedomí, že je zodpovednosťou programátora vytvárať a mazať objekty v C / C ++.
Ak programátor zabudne zničiť vytvorené objekty, vzniknú vážne chyby. Je to preto, lebo zlyhanie pri deštrukcii objektov môže spôsobiť „ Nedostatok pamäte ”Chyby, úniky pamäte atď.
O túto situáciu je v Jave úplne postarané, pretože nie je potrebné, aby programátor sledoval objekty. Java sa o nás stará o ničenie objektov prostredníctvom automatického zberu odpadu.
=> Navštívte tu a dozviete sa Java od začiatku.
Proces, pri ktorom sa objekty, ktoré sa už nepoužívajú, odstránia z pamäte haldy, sa nazýva „Zber odpadu“. Technika zberu odpadu je súčasťou správy pamäte v Jave.
V Jave tak Garbage Collector zničí všetky objekty, ktoré sa už nepoužívajú.
Čo sa dozviete:
Čo je zberač odpadu v Jave?
Garbage Collection v Jave je spravovaný programom nazvaným Garbage Collector.
Garbage Collector možno definovať ako program, ktorý sa používa na automatickú správu pamäte spracovaním de-alokácie objektu.
Vieme, že v jazyku Java sú nové objekty vytvárané a prideľovaná pamäť pomocou nového operátora. Pamäť pridelená objektu pomocou nového operátora zostáva alokovaná, kým odkazy tento objekt nepoužívajú.
Len čo referencie prestanú existovať, pamäť, ktorú objekt obsadí, sa získa späť. Java potom spracuje de-alokáciu alebo zničenie objektov automaticky a my nemusíme explicitne ničiť objekt.
Táto technika je technikou Garbage Collection v Jave, kde programátori nemusia explicitne spracovávať deallokáciu objektov.
Upozorňujeme, že ak programy nedealokujú pamäť, keď ju objekty nepotrebujú, nakoniec nezostane žiadna pamäť na alokáciu a programy sa zrútia. Táto situácia sa nazýva únik pamäte.
Smetiar vždy beží na pozadí na vlákne démona. Garbage Collector sa považuje za najlepší príklad vlákna démona.
Program Garbage Collector beží s úmyslom uvoľniť pamäť haldy. Robí to zničením objektov, ktoré sú „nedosiahnuteľné“.
Čo je to „nedosiahnuteľný“ objekt?
Objekt sa stáva nedostupným, keď k nemu nie je priradený ani jeden odkaz.
Zvážte nasledujúci kód:
Integer ref_obj = new Integer (5); //ref_obj is a reference to Integer ref_obj = null; //Integer object now becomes unreachable
Ako je zrejmé z vyššie uvedeného kódu, objekt je dosiahnuteľný, pokiaľ je s ním spojený odkaz. V okamihu, keď je referenčné združenie odstránené (vo vyššie uvedenom prípade je to odkaz na hodnotu null), objekt sa stane nedostupným.
Keď sa objekt stane nedostupným, stane sa vhodným pre Garbage Collection (GC).
Ako môžeme dosiahnuť, aby bol objekt vhodný pre GC?
Aj keď sa od programátora nevyžaduje, aby zničil objekty, pretože sa o ne stará GC, prinajmenšom môže programátor urobiť tieto objekty nedostupnými, keď už ich viac nepotrebuje.
Týmto spôsobom GC zhromaždí nedosiahnuteľné objekty a zničí ich.
Existuje niekoľko spôsobov, ako urobiť objekt vhodným pre GC tým, že ho urobíte nedosiahnuteľným.
Oni sú:
# 1) Zrušiť odkaz
Ak je daný objekt priradený k odkazu, ak už tento objekt nie je potrebný, priraďte ho k hodnote null.
Student s = new Student (); s = null;
Keď je s nastavený na null, objekt Student sa stane nedostupným.
# 2) Znovu priraďte referenciu
Toto je ďalší spôsob, ako zabezpečiť, aby boli objekty vhodné pre GC.
Zvážte nasledujúci kód.
Student s1 = new Student (); Student s2 = new Student (); s1 = s2;
Teraz, keď sme priradili s1 k inému objektu, je študentský objekt, na ktorý sa odkazuje s1, dereferencovaný.
# 3) Vytvorte anonymný objekt
Vytvorením anonymného objektu môžeme vytvoriť objekty vhodné pre GC.
Môžeme vytvoriť anonymný objekt, ako je uvedené nižšie:
new Student();
Len čo urobíme objekty vhodnými na GC, tieto objekty môžu alebo nemusia byť okamžite zničené GC. Je to preto, že nemôžeme výslovne prinútiť GC, aby vykonal, kedykoľvek chceme.
Kedy beží zberač odpadkov?
Je na JVM, aby spustil program Garbage Collector. Keď JVM spustí Garbage Collector, nedosiahnuteľné objekty sa zničia. Nemôžeme však zaručiť, kedy bude JVM fungovať.
Aj keď nemôžeme GC prinútiť k vykonaniu, môžeme veľmi dobre požiadať o odvoz odpadu.
O GC je možné požiadať pomocou ktorejkoľvek z nasledujúcich metód.
# 1) System.gc (): Trieda System v jazyku Java poskytuje statickú metódu gc (), pomocou ktorej môžeme požiadať JVM o spustenie programu Garbage Collector.
# 2) Runtime.getRuntime (). Gc (): Rovnako ako System.gc (), môžeme tiež použiť metódu gc () „triedy Runtime“ na vyžiadanie JVM na spustenie programu Garbage Collector.
Poznámka: Nie je možné zaručiť, že program Garbage Collector bude bežať po žiadosti od týchto dvoch metód.
Finalizácia
Finalizáciu vykonáva Garbage Collector tesne pred zničením objektov. V rámci finalizačnej techniky volá program Garbage Collector metódu finalize () na objekte. Na vykonanie čistiacich aktivít sa používa metóda finalize ().
Metódu finalize () poskytuje trieda „Object“ a má nasledujúci prototyp.
protected void finalize () throws Throwable
Metóda finalize () sa vyvolá vždy, keď sa objekt zhromažďuje odpadky
Poznámka: Zberateľ odpadu zhromažďuje iba objekty, ktoré sú vytvorené pomocou nového kľúčového slova. U ostatných objektov musíme na vyčistenie použiť metódu finalize ().
Nasledujúci program zobrazuje jednoduchú zbierku odpadu v Jave.
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ýkon
Vo vyššie uvedenom programe sme vytvorili triedu TestGC. V tejto triede sme prepísali metódu finalize (). Potom v hlavnej triede vytvoríme dva objekty triedy TestGC. Najskôr zrušíme neplatnosť objektu a zavoláme System.gc (), aby sme požiadali o Garbage Collector.
Ďalej zrušíme druhý objekt a zavoláme metódu Runtime.getRuntime.gc (), aby sme požiadali o Garbage Collector. Výstup zobrazuje výstup metódy finalizácie dvakrát, čo naznačuje, že program Garbage Collector bežal dvakrát.
Poznámka: Aj keď máme tento výstup, nie je zaručené, že zakaždým dostaneme rovnaký výstup. Úplne to závisí od JVM.
Ako funguje odvoz odpadu v Jave?
V tejto časti uvidíme, ako funguje Garbage Collection v Jave.
Počas zberu odpadu Garbage Collector vyhľadá pamäť haldy a potom „označí“ nedosiahnuteľné objekty. Potom ich to zničí.
Problém však nastáva, keď sa počet objektov zvyšuje. S pribúdajúcimi objektmi sa zvyšuje aj čas potrebný na Garbage Collection, keď sa hľadajú nedostupné objekty. Neovplyvňuje to však príliš, pretože väčšina objektov má krátku životnosť.
Vyššie uvedené správanie sa nazýva „Generačný zber odpadu“ a má zlepšiť výkon JVM. V tomto prístupe je celý priestor haldy rozdelený na - mladú generáciu, starú alebo tenurovanú generáciu a stálu generáciu.
# 1) Haldy mladej generácie: V tomto priestore sú vytvorené všetky nové objekty. Akonáhle je priestor plný, uskutoční sa Malý GC, v ktorom sú zničené všetky mŕtve objekty. Malý proces GC je rýchly a rýchly, pretože väčšina objektov je mŕtva. Predmety prežívajúce mladú generáciu sa presúvajú do starších generácií.
# 2) Halda starej generácie: Táto generácia ukladá objekty, ktoré prežijú dlho. Po dosiahnutí vekovej hranice nastavenej pre mladú generáciu sa objekt presunie do starej generácie. Keď je priestor starej generácie naplnený, vykoná sa Major GC.
Major GC je pomalý, pretože tu zahrnuté objekty sú živé objekty. Niekedy je vyčistený celý priestor haldy, ktorý zahŕňa mladé aj staré generácie. Toto sa nazýva „Full GC“.
# 3) Trvalá generáciaL Kým v Java 7 nebývala permanentná generácia (Perm Gen). Metadáta držané v Perm Gen používala JVM. Spoločnosť JVM použila tieto metadáta na opis tried a metód použitých v aplikácii. Perm Gen bol odstránený v prostredí Java 8.
Zber odpadu Java 8: Perm Gen a metaspace
Už sme sa zmienili o vesmíre Perm Gen, ktorý bol prítomný až do Javy 7. Avšak teraz v Jave 8 predstavuje JVM metadáta triedy pomocou natívnej pamäte zvanej „Metaspace“.
Okrem Metaspace existuje nový príznak s názvom „MaxMetaspaceSize“, ktorý obmedzuje pamäť použitú pre metadáta triedy. Ak pre MaxMetaspaceSize nie je zadaná žiadna hodnota, potom ho Metaspace za behu zmení podľa potreby aplikácie.
Keď priestor metaúdajov triedy dosiahne MaxMetaspaceSize, spustí sa metaspace GC. Ak je Metaspace GC nadmerný, indikuje to únik pamätí tried, načítavačov atď., Ako aj neprimeranú veľkosť.
Algoritmy zberu odpadu v Jave
Existuje mnoho spôsobov, ako sa vykonáva Garbage Collection. V tejto časti predstavíme štyri také spôsoby alebo algoritmy pre Garbage Collection v Jave.
Sériové GC
Sériový GC je najjednoduchší algoritmus GC. Funguje hlavne na malých veľkostiach haldy a jednovláknových systémoch. Počas práce Serial GC zmrazí všetky aplikácie.
Na zapnutie Serial GC môžeme použiť nasledujúcu voľbu JVM.
nové funkcie v java 8 s príkladmi
java –xx:+UseSerialGC –jar Application.java
Vyššie uvedený príkaz je možné zadať v príkazovom riadku. Tu je Application.java súbor, pre ktorý má byť povolený sériový GC.
Priepustnosť / paralelná GC
Algoritmus paralelného GC je predvolený v JDK 8. Tento algoritmus používa viac vlákien na skenovanie priestoru haldy a zhutnenie. Tento algoritmus je vhodný hlavne pre aplikácie, ktoré dokážu spracovať pauzy vlákien a optimalizovať réžiu CPU.
Jednou nevýhodou paralelného GC je, že pri vykonávaní malého alebo úplného GC algoritmus pozastavuje vlákna aplikácie.
Zberateľ CMS
CMS znamená „ Súbežný Mark Sweep “. Tento algoritmus využíva viacnásobné súbežne vlákna na skenovanie haldy ( známka ) na identifikáciu nepoužívaných predmetov a recykláciu ( zamiesť ) ich. Zberač CMS má režim Stop-The-World (STW).
Zberač ide v tomto režime do dvoch scenárov:
- Keď sa na objekty patriace k starej generácii dá dostať zo statických premenných alebo vstupných bodov vlákna. Tento režim je teda zapnutý počas inicializácie počiatočných koreňových značiek.
- Keď je algoritmus spustený súčasne, aplikácia zmení stav a prinúti kolektor vrátiť sa, aby sa ubezpečil, že sú označené správne objekty.
Zberateľ CMS však môže trpieť „zlyhaním propagácie“. Čo je teda reklamné zlyhanie? Ak sa objekty z priestoru mladej generácie presunú do starej generácie a kolektor neurobil dostatok priestoru pre tieto objekty v priestore haldy starej generácie, dôjde k propagačnej chybe.
Aby sme zabránili zlyhaniu propagácie, môžeme poskytnúť viac vlákien na pozadí zberateľovi alebo poskytnúť väčšiu veľkosť haldy starej generácii.
Zberateľ G1
Zberateľ G1 je zberačom odpadu najskôr. Je určený pre haldy s veľkosťou viac ako 4 GB. Na základe veľkosti haldy rozdeľuje veľkosť haldy na oblasti s veľkosťou od 1 MB do 32 MB.
Zberač G1 označuje objekty v závislosti od živosti objektov v celej kope. Po tejto fáze značenia si G1 uvedomuje prázdne oblasti. Takto zhromažďuje nedosiahnuteľné objekty z týchto oblastí, čím uvoľňuje veľké množstvo priestoru. Preto je pomenovaný ako Odpadky najskôr, pretože najskôr zhromažďuje oblasti obsahujúce odpadky.
Spĺňa tiež cieľový čas pauzy definovaný používateľom pomocou predikčného modelu pauzy výberom počtu oblastí, ktoré sa majú zhromaždiť, v závislosti od zadaného cieľového času pauzy.
Výhoda odvozu odpadu
- Garbage Collection zefektívňuje správu pamäte v Jave, pretože odstraňuje nereferenčné objekty z haldy pamäte bez zásahu programátora.
- Pretože Garbage collection je automatický a je súčasťou JVM, nie je potrebné žiadne ďalšie úsilie programátora na získanie pamäte alebo zničenie objektov.
- Programátor nemusí písať žiadny konkrétny kód na de-alokáciu pamäte a mazanie objektov, ako je to v C / C ++.
často kladené otázky
Otázka 1) Aká je úloha Zberača odpadu?
Odpoveď: V Jave je Garbage Collector hlavnou stranou v správe pamäte a má za úlohu zhromažďovať nedosiahnuteľné objekty a znovu získavať pamäť.
Otázka 2) Čo máte na mysli pod pojmom Garbage Collection?
Odpoveď: Zber odpadu je technika, pomocou ktorej sa pamäť spravuje automaticky získaním nevyužitej pamäte. Je to vlastnosť prítomná v programovacích jazykoch, ako je Java, kvôli ktorej programátori nemusia sledovať nepoužívané objekty a ničiť ich. Robí sa to automaticky pomocou programu Garbage Collection.
Otázka č. 3) Kto je zodpovedný za odvoz odpadu v Jave?
Odpoveď: Za správu pamäte Java zodpovedá Garbage Collection.
Otázka č. 4) Ako môžeme zabrániť zbieraniu odpadu v Jave?
Odpoveď: Pretože program Garbage Collector nezíska späť pamäť premenných / objektov, ktoré sú nažive, najlepším spôsobom, ako zabrániť zbieraniu odpadu, je neustále používať premenné / objekty v celom programe.
Otázka č. 5) Ako sa môžete ubezpečiť, že je predmet zbieraný ako odpad?
Odpoveď: Objekt je vhodný pre Garbage Collection, keď je nedosiahnuteľný, t. J. Ak na objekt neodkazujú žiadne ďalšie odkazy. Aj keď nemôžeme prinútiť Garbage Collector, aby bežal kedykoľvek chceme, kedykoľvek môžeme požiadať o jeho spustenie pomocou System.gc ().
Záver
Garbage Collection v Jave, o ktorom sme hovorili v tomto tutoriále, je automatický a programátor sa nemusí starať o mazanie objektov alebo premenných pridelených v programe.
Automatický zber odpadu v Jave je najdôležitejšou vlastnosťou jazyka a je súčasťou správy pamäte v Jave.
Aj keď Garbage Collection vykonáva JVM a je mimo dosahu programátora, môžeme kedykoľvek požiadať, aby bol Garbage Collector spustený pomocou metódy gc () triedy System and Runtime.
V tomto tutoriáli sme diskutovali o finalizačnom procese, ktorý sa vykonáva pred zničením objektov programom Garbage Collector. Diskutovali sme tiež o procese Garbage Collection v Jave. Nakoniec sme diskutovali o rôznych algoritmoch používaných programom Garbage Collector.
Týmto sa dokončuje naša diskusia o Garbage Collector v Jave.
=> Dajte si pozor na jednoduchú sériu školení Java tu.
Odporúčané čítanie
- Základy jazyka Java: Java Syntax, trieda Java a základné koncepty Java
- Na čo sa používa Java: 12 skutočných aplikácií Java
- Výukový program pre Java String Metódy reťazca Java s príkladmi
- Výukový program JAVA pre začiatočníkov: viac ako 100 praktických výučbových programov Java Video
- Komponenty Java: Java Platform, JDK, JRE a Java Virtual Machine
- Nasadenie Java: Vytvorenie a vykonanie súboru Java JAR
- Virtuálny stroj Java: Ako JVM pomáha pri spúšťaní aplikácií Java
- Výukový program Java Reflection s príkladmi