Tento článok je zrkadlovým článkom o strojovom preklade, kliknite sem pre prechod na pôvodný článok.

Pohľad: 12807|Odpoveď: 0

[JavaSE] Získajte hlboké pochopenie mechanizmu zberu odpadu v Jave

[Kopírovať odkaz]
Zverejnené 4. 12. 2017 20:26:51 | | |
1. Význam mechanizmu recyklácie odpadu  
Významnou vlastnosťou jazyka Java je zavedenie mechanizmu garbage collection, ktorý rieši najnáročnejší problém správy pamäte pre programátorov v C++, takže Java programátori už nemusia pri písaní programov brať do úvahy správu pamäte. Vďaka mechanizmu garbage collection už objekty v Jave nemajú pojem "rozsah", iba referencia objektu má "rozsah".Garbage collection dokáže účinne zabrániť úniku pamäte a efektívne využívať nečinnú pamäť.

ps:内存泄露是指该内存空间使用完毕之后未回收,在不涉及复杂数据结构的一般情况下,Java 的内存泄露表现为一个内存对象的生命周期超出了程序需要它的时间长度,我们有时也将其称为“对象游离”。
2. Algoritmy v mechanizmoch zberu odpadu  
Špecifikácia jazyka Java explicitne nešpecifikuje, ktorý algoritmus zberu odpadu použiť v JVM, ale každý algoritmus zberu odpadu zvyčajne potrebuje dve základné veci: (1) nájsť zbytočné informačné objekty; (2) Získať späť pamäťový priestor obsadený zbytočnými objektmi, aby ho mohol program opäť využiť.
1. Zberač počítania referencií
1.1 Analýza algoritmov

Počítanie referencií je skorá stratégia v garbage collectoroch. V tomto prístupe je pre každú inštanciu objektu v halde uvedený referenčný počet. Keď je objekt vytvorený a inštancia objektu je priradená premennej, počet premenných sa nastaví na 1. Keď je ako referencia k tomuto objektu priradená akákoľvek iná premenná, počet sa sčíta o 1 (a = b, potom čítač inštancie objektu referencovanej b) je +1), ale keď referencia na inštanciu objektu prekročí svoju životnosť alebo je nastavená na novú hodnotu, referenčný čítač inštancie objektu sa odpočíta o 1. Každá inštancia objektu s referenčným čítačom 0 môže byť odobratá ako odpad. Keď je inštancia objektu garbage collected, referenčný čítač akejkoľvek inštancie objektu, na ktorú odkazuje, je mínus 1.
1.2 Výhody a nevýhody
Zásluha:

Collector počtu referencií môže byť vykonaný veľmi rýchlo, prepletený do behu programu. Je výhodný pre prostredia v reálnom čase, kde programy nie je potrebné dlhodobo prerušovať.
Nedostatok:

Kruhové odkazy nie sú detegovateľné. *Ak má nadriadený objekt odkaz na podobjekt, podriadený objekt následne odkazuje na nadriadený objekt. Týmto spôsobom ich počet citácií nikdy nemôže byť 0.
1.3 Algoritmus počítania referencií nedokáže vyriešiť problém kruhových referencií, napríklad:
/** * Java学习交流QQ群:589809992 我们一起学Java! */public class Main {    public static void main(String[] args) {        MyObject object1 = new MyObject();        MyObject object2 = new MyObject();        object1.object = object2;        object2.object = object1;        object1 = null;        object2 = null;    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  
Posledné dve vety priraďujú objekt1 a objekt2 k null, čo znamená, že objekty na ktoré ukazujú objekty1 a objekt2 už nie je možné pristupovať, ale keďže sa navzájom odkazujú, ich referenčné čítače nie sú 0, takže zberač odpadu ich nikdy nerecykluje.
2. Sledovací zberač alebo algoritmus označovania a zametania
2.1 Algoritmus vyhľadávania koreňov


Algoritmus vyhľadávania koreňov je zavedený z teórie grafov v diskrétnej matematike, program považuje všetky referenčné vzťahy za graf, začínajúc uzlom GC ROOT, hľadajúc príslušný referenčný uzol, po nájdení tohto uzla pokračuje v hľadaní referenčného uzla tohto uzla, keď sa všetky referenčné uzly prehľadajú, zostávajúce uzly sa považujú za nereferencované, teda za zbytočné uzly.
java, ktorá môže byť použitá ako GC koreň
1. Objekty odkazované v zásobníku virtuálnych strojov (tabuľka lokálnych premenných)
2. Objekt odkazovaný statickým atribútom v oblasti metódy
3. Objekt, na ktorý odkazuje konštanta v oblasti metódy
4. Referencované objekty v lokálnom zásobníku metód (natívne objekty)
2.2 Schematický diagram algoritmu trasovania

2.3 Analýza algoritmu vyčistenia markerov

Algoritmus vyčistenia značiek skenuje z koreňovej kolekcie, označí preživšie objekty a potom prehľadá celý priestor na neoznačené objekty na recykláciu, ako je znázornené na obrázku vyššie. Algoritmus vyčistenia značiek nemusí presúvať objekty a spracováva iba neexistujúce objekty, čo je mimoriadne efektívne, keď je prežívajúcich objektov veľa, ale keďže algoritmus čistenia značiek priamo recykluje nepreživšie objekty, spôsobuje fragmentáciu pamäte.
3. Algoritmus kompaktácie alebo algoritmus dokončovania štítkov


Algoritmus tag-finish používa rovnakú metódu ako algoritmus na vyčistenie značiek na označovanie objektov, ale pri vyčistení je odlišný – po znovuzískaní priestoru obsadeného neprežívajúcimi objektmi presunie všetky preživšie objekty do voľného priestoru na ľavom konci a aktualizuje príslušný ukazovateľ. Algoritmus tag-finish je založený na algoritme tag-purge a presúva objekty, takže je drahší, ale rieši problém fragmentácie pamäte. Pri implementácii kolektorov založených na algoritme Compacting sa zvyčajne pridávajú handles a handles tabuľky.
4. Kopírovací algoritmus (kompaktný kolektor)


Algoritmus je navrhnutý tak, aby prekonal režijné náklady rukoväte a vyriešil zber odpadu z haldy. Keď je objekt plný, garbage collection založený na kopírovacom algoritme prehľadá aktívny objekt z koreňovej množiny a skopíruje každý aktívny objekt na voľnú plochu (tak, aby medzi pamäťou obsadenou aktívnym objektom neboli žiadne voľné diery), takže voľná plocha sa stane tvárou objektu, pôvodná plocha objektu sa stane voľnou plochou a program alokuje pamäť do novej plochy objektu. Typickým garbage collection založeným na copingovom algoritme je stop-and-copy algoritmus (stop-and-copy), ktorý rozdeľuje haldu na objektové a voľné plochy a program pozastaví vykonávanie počas prepínania medzi objektovými a voľnými plochami.
5. Generačný zberateľ


Generačná stratégia recyklácie odpadu je založená na tom, žeŽivotný cyklus rôznych objektov je odlišný。 Preto môžu objekty s rôznymi životnými cyklami prijať rôzne recyklačné algoritmy na zlepšenie efektivity recyklácie.
Mladá generácia
1. Všetky novo generované objekty sú najskôr umiestnené do mladšej generácie. Cieľom mladšej generácie je zbierať tieto predmety s krátkym životným cyklom čo najrýchlejšie.

2. Pamäť novej generácie je rozdelená na jednu oblasť Eden a dve zóny preživších (survivor0, survivor1) podľa pomeru 8:1:1. Jedna Eden zóna, dve Survivor zóny (všeobecne). Väčšina objektov sa objavuje v oblasti Eden. Keď je oblasť survivor0 tiež plná, oblasť eden a oblasť survivor 0 sa skopírujú do inej oblasti survivor1, potom sa vyprázdnia oblasť eden a survivor0, oblasť survivor0 je prázdna a oblasť survivor0 sa vymenia. To znamená, nechať oblasť survivor1 prázdnu a podobne.

3. Keď oblasť preživšieho 1 nestačí na uskladnenie preživších predmetov z Eden a Survivor0, preživšie predmety sa ukladajú priamo do starej éry. Ak je staroba tiež plná, spustí sa plná GC, teda nová generácia a stará generácia sa recykluje

4. GC novej generácie sa tiež nazýva Minor GC a frekvencia MinorGC je relatívne vysoká (nemusí sa spustiť, keď je oblasť Eden plná)
Stará generácia

1. Objekty, ktoré sú stále živé po skúsenostiach s recykláciou odpadu N u mladšej generácie, budú umiestnené do staršej generácie. Preto možno považovať starú generáciu za uloženú v niektorých objektoch s dlhým životným cyklom.

2. Pamäť je tiež oveľa väčšia ako u novej generácie (približný pomer je 1:2), keď je pamäť starého veku plná, spustí sa Major GC, teda Full GC, frekvencia Full GC je relatívne nízka, čas prežitia objektu starého veku je relatívne dlhý a hranica miery prežitia je vysoká.
Trvalá generácia
Používa sa na ukladanie statických súborov, ako sú Java triedy, metódy a podobne. Perzistentné generácie nemajú významný vplyv na garbage collection, ale niektoré aplikácie môžu dynamicky generovať alebo volať niektoré triedy, napríklad Hibernate a podobne, a v tomto prípade je potrebné nastaviť relatívne veľký trvalý generačný priestor na uloženie týchto nových tried počas behu.
3. GC (zberač odpadu)Zberatelia používané novou generáciou zberateľov: Serial, PraNew, Parallel Scavenge
Zberateľské zariadenia používané zberateľmi starého veku: Sériový starý, paralelný starý, CMS

Sériový kolektor (replikačný algoritmus)
Nová generácia jednozávitových zberačov, označovanie a čistenie je jednovláknová, s výhodou jednoduchosti a efektivity.
Sériový starý zberateľ (algoritmus etikety a dokončenia)
Starý jednovláknový zberač, starodobá verzia sériového zberača.
ParNew kolektor (algoritmus stop-copy)
Novú generáciu kolektora možno považovať za viacvláknovú verziu Serial collectora, ktorá má lepší výkon ako Serial v prostredí s viacjadrovým procesorom.
Paralelný zberateľ (algoritmus stop-copy)
Paralelné zberače pre vysokú priepustnosť a efektívne využitie CPU. Priepustnosť je zvyčajne 99 % a priepustnosť = čas používateľského vlákna / (čas používateľského vlákna + čas GC vlákna). Je vhodný pre situácie, ako sú aplikácie na pozadí, ktoré nevyžadujú vysokú interakciu.
Paralelný starý zberač (algoritmus stop-copy)
Staršia verzia Parallel Scavenge kolektora, paralelný zberač, s prioritou priepustnosti
CMS (Concurrent Mark Sweep) Collector (Mark-Clean algoritmus)
Vysoká súbežnosť, nízka pauza, snaha o najkratšiu dobu pauzy obnovy z GC, vysoké využitie CPU, rýchla odozva, krátka pauza a viacjadrový CPU usilujúci sa o vysokú odozvu
4. Mechanizmus implementácie GCKeďže predmet bol spracovaný v rôznych generáciách, oblasť a čas zberu odpadu sa tiež líšia. Existujú dva typy GC: Scavenge GC a Full GC.
Scavenge GC
Zvyčajne, keď sa vygeneruje nový objekt a nezíska priestor v Edene, spustí sa GC Scavenge, ktorý zlikviduje oblasť Eden, odstráni neexistujúce objekty a presunie preživšie objekty do oblasti Survivor. Potom si vyrieš dve zóny Survivora. GC sa týmto spôsobom vykonáva v oblasti Eden mladšej generácie a neovplyvňuje staršiu generáciu. Keďže väčšina objektov začína v oblasti Eden a oblasť Eden nie je pridelená veľa, GC oblasti Eden sa vykonáva často. Preto je všeobecne potrebné použiť rýchle a efektívne algoritmy, aby bol Eden čo najskôr voľný.
Plný GC
Zorganizujte celý zoznam, vrátane mladých, trvalých a trvalých. Full GC je pomalší ako Scavenge GC, pretože vyžaduje recykláciu celej haldy, takže počet plných GC by sa mal čo najviac znížiť. Veľká časť procesu ladenia JVM spočíva v ladení FullGC. Plný GC môže byť spôsobený z nasledujúcich dôvodov:
1. Trvalý pracovný pomer sa píše v plnom rozsahu
2. Perm sa píše v plnom rozsahu  
3. System.gc() sa zobrazuje ako volanie  
4. Stratégia alokácie domén v halde sa dynamicky mení po poslednej GC
5. Java s GC bude mať tiež problémy s únikom pamäte1. Použitie tried statických kolekcií ako HashMap, Vector a podobne je najnáchylnejšie na únik pamäte a životný cyklus týchto statických premenných je rovnaký ako v aplikácii, pričom všetky objekty nemožno uvoľniť, pretože budú vždy aplikované Vectorom a ďalšími.
Statický vektor v = nový vektor(); pre (int i = 1; i<100; i++) { Objekt o = nový objekt();     v.add(o);     o = null; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  
V tomto príklade je referencia v pre vektorový objekt a referencia o pre objekt objektu v kódovom zásobníku. V For cykle neustále generujeme nové objekty, potom ich pridávame do vektorového objektu a následne nullujeme o referenciu. Otázka znie, keď je o referencia zrušená, ak GC nastane, môže byť objekt, ktorý sme vytvorili, recyklovaný GC? Odpoveď je nie. Pretože keď GC sleduje referencie v kódovom zásobníku, nájde v referenciách, a ak budete pokračovať v sledovaní, zistíte, že v pamäťovom priestore sú odkazy na objektové objekty, na ktoré odkazuje v referenciách. To znamená, že aj keď bola o referencia vyprázdnená, stále existujú ďalšie odkazy na objekt, ku ktorým je možné pristupovať, takže GC ich nemôže uvoľniť. Ak po tejto slučke objekt Object nemá na program žiadny vplyv, predpokladáme, že Java má únik pamäte.
2. Rôzne spojenia, databázové, sieťové pripojenia, IO pripojenia a podobne neukazujú hovor takmer uzavretý a GC ich nerecykluje, čo vedie k úniku pamäte.
3. Použitie poslucháčov môže tiež spôsobiť únik pamäte, ak poslucháč nie je vymazaný pri uvoľňovaní objektu.




Predchádzajúci:Nováčikovia hrajú s čiernou technológiou v CSS
Budúci:Dávaj si pozor na softvérový vírus Wanke Cloud Snap, Trojan!
Vyhlásenie:
Všetok softvér, programovacie materiály alebo články publikované spoločnosťou Code Farmer Network slúžia len na vzdelávacie a výskumné účely; Vyššie uvedený obsah nesmie byť použitý na komerčné alebo nezákonné účely, inak nesú všetky následky používateľmi. Informácie na tejto stránke pochádzajú z internetu a spory o autorské práva s touto stránkou nesúvisia. Musíte úplne vymazať vyššie uvedený obsah zo svojho počítača do 24 hodín od stiahnutia. Ak sa vám program páči, podporte originálny softvér, zakúpte si registráciu a získajte lepšie originálne služby. Ak dôjde k akémukoľvek porušeniu, kontaktujte nás prosím e-mailom.

Mail To:help@itsvse.com