Tento článek je zrcadlovým článkem o strojovém překladu, klikněte zde pro přechod na původní článek.

Pohled: 12807|Odpověď: 0

[JavaSE] Získejte hluboké pochopení mechanismu garbage collection v Javě

[Kopírovat odkaz]
Zveřejněno 04.12.2017 20:26:51 | | |
1. Význam mechanismu recyklace odpadu  
Významnou vlastností jazyka Java je zavedení mechanismu garbage collection, který řeší nejobtížnější problém správy paměti pro programátory v C++, takže programátoři v Javě již nemusí při psaní programů brát v úvahu správu paměti. Díky mechanismu garbage collection už objekty v Javě nemají pojem "rozsah", pouze odkaz objektu má "rozsah".Garbage collection může účinně zabránit úniku paměti a efektivně využívat nečinnou paměť.

ps:内存泄露是指该内存空间使用完毕之后未回收,在不涉及复杂数据结构的一般情况下,Java 的内存泄露表现为一个内存对象的生命周期超出了程序需要它的时间长度,我们有时也将其称为“对象游离”。
2. Algoritmy v mechanismech sběru odpadu  
Specifikace jazyka Java výslovně nespecifikuje, který algoritmus garbage collection použít v JVM, ale každý algoritmus garbage collection obvykle potřebuje dvě základní věci: (1) najít zbytečné informační objekty; (2) Získat zpět paměťový prostor obsazený neužitečnými objekty, aby mohl být tento prostor znovu využit programem.
1. Sběrač pro počítání referencí
1.1 Analýza algoritmů

Počítání odkazů je ranou strategií v garbage collectorech. V tomto přístupu existuje referenční počet pro každou instanci objektu v haldě. Když je objekt vytvořen a instance objektu přiřazena k proměnné, počet proměnných se nastaví na 1. Pokud je jako reference k tomuto objektu přiřazena jakákoli jiná proměnná, počet se sečte o 1 (a = b, pak čítač instance objektu odkazované b) je +1), ale když odkaz na instanci objektu překročí svou životnost nebo je nastaven na novou hodnotu, referenční čítač instance objektu se odečte o 1. Každá instance objektu s referenčním čítačem 0 může být odebrána jako odpad. Když je instance objektu garbage collected, referenční čítač každé instance objektu, na kterou odkazuje, je minus 1.
1.2 Výhody a nevýhody
Zásluha:

Collector počtu referencí lze provádět velmi rychle, propletený do běhu programu. Je výhodná pro prostředí v reálném čase, kde není třeba programy přerušovat na dlouhou dobu.
Nedostatek:

Kruhové odkazy nelze detekovat. *Pokud má nadřazenský objekt odkaz na podřízený objekt, podřízený objekt následně odkazuje na rodičovský objekt. Tímto způsobem jejich počet citací nikdy nemůže být 0.
1.3 Algoritmus počítání referencí nemůže vyřešit problém kruhové reference, napří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í dvě věty přiřazují objekt1 a objekt2 nullu, což znamená, že objekty na které ukazují objekty1 a objekt2 již nelze přistupovat, ale protože se navzájem odkazují, jejich referenční čítače nejsou 0, takže sběrač odpadu je nikdy nerecykluje.
2. Sledovací sběrač nebo algoritmus označování a zametaní
2.1 Algoritmus pro root search


Algoritmus pro vyhledávání kořenů je zaveden z teorie grafů v diskrétní matematice, program považuje všechny referenční vztahy za graf, začíná uzlem GC ROOT, hledá odpovídající referenční uzel, po nalezení tohoto uzlu pokračuje v hledání referenčního uzlu tohoto uzlu, když jsou všechny referenční uzly prohledány, zbývající uzly jsou považovány za nereferencované, tedy za zbytečné uzly.
java, která může být použita jako GC kořen
1. Objekty odkazované ve zásobníku virtuálních strojů (tabulka lokálních proměnných)
2. Objekt odkazovaný statickým atributem v oblasti metody
3. Objekt odkazovaný konstantou v oblasti metody
4. Odkazované objekty v lokálním zásobníku metod (nativní objekty)
2.2 Schematický diagram algoritmu trasování

2.3 Analýza algoritmu pro vyčištění značek

Algoritmus čištění štítků skenuje z kořenové kolekce, označí přeživší objekty a poté prohledá celý prostor na neoznačené objekty k recyklaci, jak je znázorněno na obrázku výše. Algoritmus pro vyčištění štítků nemusí přesouvat objekty a zpracovává pouze nepřeživší objekty, což je extrémně efektivní, když je přeživších mnoho objektů, ale protože algoritmus čištění štítků přímo recykluje nepřeživší objekty, způsobí to fragmentaci paměti.
3. Algoritmus pro zhutnění nebo algoritmus pro dokončování štítků


Algoritmus dokončení štítků používá stejnou metodu jako algoritmus pro vymazávání štítků pro označování objektů, ale při vyčištění je odlišný – po znovuzískání prostoru obsazeného nepřežívajícími objekty přesune všechny přeživší objekty do volného prostoru na levém konci a aktualizuje odpovídající ukazatel. Algoritmus tag-finish je založen na algoritmu tag-purge a přesouvá objekty, takže je dražší, ale řeší problém fragmentace paměti. Při implementaci kolektorů založených na algoritmu Compacting se obvykle přidávají handles a handles tabulky.
4. Kopírovací algoritmus (kompromitační kolektor)


Algoritmus je navržen tak, aby překonal režijní zátěž rukojeti a vyřešil sbírku odpadu z haldy. Když je objekt plný, garbage collection založený na kopírovacím algoritmu naskenuje aktivní objekt z kořenové sady a zkopíruje každý aktivní objekt na volnou plochu (takže mezi pamětí obsazenou aktivním objektem nejsou žádné volné mezery), takže volný povrch se stane plochou objektu, původní plocha objektu volnou plochou a program přidělí paměť do nové plochy objektu. Typickým sběrem odpadu založeným na copingovém algoritmu je stop-and-copy algoritmus, který rozděluje haldu na objektové a volné plochy a program pozastaví provádění při přepínání mezi objektovými a volnými plochami.
5. Generační sběratel


Generační strategie recyklace odpadu je založena na tom, žeŽivotní cyklus různých objektů je odlišný。 Proto mohou objekty s různými životními cykly používat různé recyklační algoritmy ke zlepšení efektivity recyklace.
Mladá generace
1. Všechny nově generované objekty jsou nejprve zařazeny do mladší generace. Cílem mladší generace je co nejrychleji sbírat tyto předměty s krátkým životním cyklem.

2. Paměť nové generace je rozdělena do jedné oblasti Eden a dvou zón přeživších (survivor0, survivor1) podle poměru 8:1:1. Jedna Eden zóna, dvě Survivor zóny (obecně). Většina objektů se objevuje v oblasti Eden. Když je oblast survivor0 také plná, oblast eden a oblast survivor 0 se zkopírují do jiné oblasti survivor1, pak se vyprázdní oblast eden a survivor0, oblast survivor0 je prázdná a oblast survivor0 se vyměňují a oblast survivor0 a oblast survivor1. To znamená, že oblast Survivor1 je prázdná a tak dále.

3. Když oblast přeživší 1 nestačí na uložení přeživších předmětů z Edenu a Přeživší0, jsou tyto předměty uloženy přímo do staré éry. Pokud je i stáří plné, spustí se plná zelená generace, tedy nová generace a stará generace bude recyklována

4. GC nové generace se také nazývá Minor GC a frekvence MinorGC je relativně vysoká (nemusí být nutně aktivována, když je oblast Eden plná)
Stará generace

1. Objekty, které jsou stále živé po zkušenosti s recyklací odpadu N u mladší generace, budou zařazeny do starší generace. Lze tedy považovat za to, že stará generace je uložena v některých objektech s dlouhým životním cyklem.

2. Paměť je také mnohem větší než u nové generace (přibližný poměr je 1:2), když je paměť starého věku plná, spustí se hlavní GC, tedy plná GC, frekvence plné generace je relativně nízká, doba přežití objektu starého věku je poměrně dlouhá a míra přežití je vysoká.
Trvalá generace
Používá se k ukládání statických souborů, jako jsou Java třídy, metody atd. Perzistentní generace nemají významný vliv na garbage collection, ale některé aplikace mohou dynamicky generovat nebo volat některé třídy, například Hibernate apod., a v tomto případě je potřeba nastavit relativně velký trvalý generační prostor pro ukládání těchto nových tříd během běhu.
3. GC (Garbage Collector)Sběratele používané novou generací sběratelů: Sériové, PraNew, Paralelní sběratelské nástroje
Sběratele používané sběrateli Old Age: Serial Old, Parallel Old, CMS

Sériový kolektor (replikační algoritmus)
Nová generace jednovlákných sběračů, označování a čištění jsou jednovlákné, s výhodou jednoduchosti a efektivity.
Sériový starý sběratel (algoritmus etikety a dokončování)
Jednovláknový sběrač Starého věku, verze Sériového sběrače pro starší dobu.
ParNew kolektor (algoritmus stop-copy)
Nová generace kolektoru může být považována za vícevláknovou verzi Serial kolektoru, která má lepší výkon než Serial v prostředí s více jádry CPU.
Paralelní sběrač sběratelů (algoritmus stop-copy)
Paralelní kolektory pro vysokou propustnost a efektivní využití CPU. Propustnost je obecně 99 % a propustnost = čas uživatelského vlákna / (čas uživatelského vlákna + čas GC vlákna). Je vhodný pro scénáře, jako jsou aplikace na pozadí, které nevyžadují odpovídající vysokou interakci.
Paralelní starý sběratel (algoritmus stop-copy)
Starší verze Parallel Scavenge collectoru, paralelní kolektor, s prioritou propustnosti
CMS (Concurrent Mark Sweep) kolektor (algoritmus Mark-Clean)
Vysoká souběžnost, nízká pauza, snaha o co nejkratší dobu pauzy obnovy GC, vysoké využití CPU, rychlá odezva, krátká pauza a vícejádrový CPU usilující o vysokou odezvu
4. Mechanismus implementace GCProtože byl předmět zpracován v různých generacích, liší se i oblast a doba sběru odpadu. Existují dva typy GC: Scavenge GC a Full GC.
Sběr zlaté karty
Obvykle, když je vygenerován nový objekt a nepodaří se mu získat místo v Edenu, spustí se GC Scavenge, který odstraní oblast Eden, odstraní nepřeživší objekty a přesune přeživší objekty do oblasti Survivor. Pak rozdělte dvě zóny Survivoru. GC se tímto způsobem provádí na oblasti Eden mladší generace a neovlivňuje starší generaci. Protože většina objektů začíná v oblasti Eden a oblast Eden není příliš přidělena, GC oblasti Eden se provádí často. Proto je obecně nutné zde používat rychlé a efektivní algoritmy, aby byl Eden co nejdříve zdarma.
Plný GC
Uspořádejte celý seznam, včetně mladých, trvalých a trvalých. Full GC je pomalejší než Scavenge GC, protože vyžaduje recyklaci celé haldy, takže počet plných GC by měl být co nejvíce snížen. Velkou část procesu ladění JVM tvoří ladění FullGC. Plné GC může být způsobeno následujícími důvody:
1. Tenure je napsán v plném rozsahu
2. Perm je zapsán v plném rozsahu  
3. System.gc() je zobrazen jako volání  
4. Strategie alokace domén v haldě se dynamicky mění po posledním GC
5. Java s GC bude mít také problémy s únikem paměti1. Použití statických tříd sběru, jako jsou HashMap, Vector atd., je nejnáchylnější k úniku paměti, a životní cyklus těchto statických proměnných je stejný jako u aplikace, a všechny objekty nelze uvolnit, protože budou vždy aplikovány Vectorem a dalšími.
Statický vektor v = nový vektor(); pro (int i = 1; i<100; i++) { Object o = nový Object();     v.add(o);     o = null; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  
V tomto příkladu je v kódovém zásobníku reference v pro vektorový objekt a reference o pro objekt objektu. V For smyčce neustále generujeme nové objekty, pak je přidáváme do vektorového objektu a následně nullujeme o reference. Otázka zní, když je o reference zrušena, a pokud GC nastane, může být objekt, který jsme vytvořili, recyklován GC? Odpověď je ne. Protože když GC sleduje reference v kódovém zásobníku, najde v references, a pokud budete dál sledovat dolů, zjistíte, že v paměťovém prostoru jsou odkazy na objektové objekty, na které odkazy v odkazují. To znamená, že i když byla o reference vyprázdněna, stále existují další odkazy na objekt, ke kterým lze přistupovat, takže GC je nemůže uvolnit. Pokud po této smyčce objekt Object nemá na program žádný vliv, předpokládáme, že Java program má únik paměti.
2. Různá spojení, databázová, síťová, IO připojení atd. neukazují hovor téměř uzavřený a nejsou recyklována GC, což vede k úniku paměť.
3. Použití posluchačů může také způsobit únik paměti, pokud posluchač není při uvolňování objektu smazán.




Předchozí:Nováčci hrají v CSS trochu černošské technologie
Další:Pozor na softwarový virus Wanke Cloud Snap, Trojan!
Zřeknutí se:
Veškerý software, programovací materiály nebo články publikované organizací Code Farmer Network slouží pouze k učení a výzkumu; Výše uvedený obsah nesmí být používán pro komerční ani nelegální účely, jinak nesou všechny důsledky uživatelé. Informace na tomto webu pocházejí z internetu a spory o autorská práva s tímto webem nesouvisí. Musíte výše uvedený obsah ze svého počítače zcela smazat do 24 hodin od stažení. Pokud se vám program líbí, podporujte prosím originální software, kupte si registraci a získejte lepší skutečné služby. Pokud dojde k jakémukoli porušení, kontaktujte nás prosím e-mailem.

Mail To:help@itsvse.com