Ta članek je zrcalni članek strojnega prevajanja, kliknite tukaj za skok na izvirni članek.

Pogled: 12807|Odgovoriti: 0

[JavaSE] Pridobite poglobljeno razumevanje mehanizma zbiranja smeti v Javi

[Kopiraj povezavo]
Objavljeno na 4. 12. 2017 20:26:51 | | |
1. Pomen mehanizma recikliranja smeti  
Pomembna lastnost jezika Java je uvedba mehanizma za zbiranje smeti, ki reši najzahtevnejši problem upravljanja pomnilnika za programerje v C++, tako da Java programerjem pri pisanju programov ni več treba upoštevati upravljanja pomnilnika. Zaradi mehanizma zbiranja smeti objekti v Javi nimajo več pojma "obseg", temveč le referenca objekta ima "obseg".Zbiranje smeti lahko učinkovito prepreči uhajanje pomnilnika in učinkovito uporablja neaktivni pomnilnik.

ps:内存泄露是指该内存空间使用完毕之后未回收,在不涉及复杂数据结构的一般情况下,Java 的内存泄露表现为一个内存对象的生命周期超出了程序需要它的时间长度,我们有时也将其称为“对象游离”。
2. Algoritmi v mehanizmih zbiranja smeti  
Specifikacija jezika Java izrecno ne določa, kateri algoritem za zbiranje smeti uporabiti v JVM, vendar mora vsak algoritem za zbiranje smeti običajno opraviti dve osnovni nalogi: (1) najti neuporabne informacijske objekte; (2) Pridobiti nazaj pomnilniški prostor, ki ga zasedajo neuporabni objekti, da ga lahko program ponovno uporabi.
1. Zbiralec za štetje referenc
1.1 Analiza algoritmov

Štetje referenc je zgodnja strategija v zbiralcih smeti. Pri tem pristopu obstaja referenčno število za vsako instanco objekta v kupu. Ko je ustvarjen objekt in je instanca dodeljena spremenljivki, se število spremenljivk nastavi na 1. Ko je kot referenca temu objektu dodeljena katera koli druga spremenljivka, se števec prišteje za 1 (a = b, števec primerka objekta, na katerega se sklicuje b, pa je +1), vendar ko je referenca na instanco objekta presegla svojo življenjsko dobo ali je nastavljena na novo vrednost, se števec referenčnega primera objekta odšteje za 1. Vsak primer objekta z referenčnim števcem 0 je mogoče zabrati kot smeti. Ko je instanca objekta zbirana kot smeti, je referenčni števec vsake instance objekta, na katero se sklicuje, minus 1.
1.2 Prednosti in slabosti
Zasluga:

Collector števila referenc je mogoče izvesti zelo hitro, vpleten v izvajanje programa. To je koristno za okolja v realnem času, kjer programi niso prekinjeni za daljša obdobja.
Pomanjkljivost:

Krožnih referenc ni mogoče zaznati. *Če ima nadređeni objekt referenco na podredni objekt, se podredni objekt nato sklicuje na nadrejen objekt. Na ta način njihovo število citatov nikoli ne more biti 0.
1.3 Algoritem štetja referenc ne more rešiti problema krožne reference, na primer:
/** * 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
  
Zadnja dva stavka dodelita objekt1 in objekt2 null, kar pomeni, da objektov, na katere kažeta objekt1 in objekt2, ni več dostopa, vendar ker se med seboj nanašata, njuni referenčni števec ni 0, zato ga zbiralnik smeti nikoli ne bo recikliral.
2. Sledilni zbiralec ali algoritem označevanja in pometanja
2.1 Algoritem iskanja korenov


Algoritem iskanja korenov je uveden iz teorije grafov v diskretni matematiki, program obravnava vse referenčne relacije kot graf, začne z vozliščem GC ROOT, išče ustrezno referenčno vozlišče, po iskanju tega vozlišča nadaljuje iskanje referenčnega vozlišča tega vozlišča, ko so vsa referenčna vozlišča preiskana, se preostala vozlišča štejejo za nereferencirana, torej neuporabna vozlišča.
java, ki jo je mogoče uporabiti kot GC koren
1. Objekti, na katere se sklicujemo v skladu virtualnih strojev (tabela lokalnih spremenljivk)
2. Objekt, na katerega se sklicuje statični atribut v območju metode
3. Objekt, na katerega se sklicuje konstanta v območju metode
4. Referencirani objekti v lokalnem skladu metod (izvorni objekti)
2.2 Shematski diagram algoritma sledenja

2.3 Analiza algoritma za čiščenje markerjev

Algoritem čiščenja oznak skenira iz korenske zbirke, označi preživele objekte in nato pregleda celoten prostor za neoznačene objekte za recikliranje, kot je prikazano na zgornji sliki. Algoritem za čiščenje oznak ne potrebuje premikanja objektov in obdeluje le nepreživele objekte, kar je izjemno učinkovito, kadar je preživelih veliko, vendar ker algoritem čiščenja oznak neposredno reciklira nepreživele objekte, bo to povzročilo fragmentacijo pomnilnika.
3. Algoritem za kompaktiranje ali algoritem za zaključevanje etiket


Algoritem za dokončanje oznak uporablja isto metodo kot algoritem za čiščenje oznak za označevanje objektov, vendar je pri čiščenju drugačen; po ponovnem zavzetju prostora, ki ga zasedajo nepreživeli objekti, premakne vse preživele objekte v prosto polje na levem koncu in posodobi ustrezni kazalec. Algoritem za dokončanje oznak temelji na algoritmu čiščenja oznak in premika objekte, zato je dražji, vendar rešuje problem fragmentacije pomnilnika. Pri implementaciji kolektorjev, ki temeljijo na algoritmu za kompaktiranje, se običajno dodajo ročaji in tabele ročajev.
4. Algoritem kopiranja (zbiralnik za kompaktiranje)


Algoritem je predlagan za premagovanje režijskih stroškov ročaja in reševanje zbiranja smeti iz kupa. Ko je objekt poln, zbiralnik smeti, ki temelji na algoritmu kopiranja, skenira aktivni objekt iz korenskega nabora in kopira vsak aktivni objekt na prosto ploskvo (tako da ni prostih vrzeli med pomnilnikom, ki ga zaseda aktivni objekt), tako da prosta površina postane ploskva objekta, izvirna ploskva objekta postane prosta ploskva, program pa dodeli pomnilnik v novo ploskvico objekta. Tipičen zbiralnik smeti, ki temelji na algoritmu copinga, je algoritem stop-and-copy, ki razdeli kup na objektne ploskve in proste površine, program pa ustavi izvajanje med preklapljanjem med objektnimi ploskvi in prostimi površinami.
5. Generacijski zbiratelj


Generacijska strategija recikliranja smeti temelji na dejstvu, daŽivljenjski cikel različnih predmetov je drugačen。 Zato lahko predmeti z različnimi življenjskimi cikli sprejmejo različne algoritme recikliranja za izboljšanje učinkovitosti recikliranja.
Mlada generacija
1. Vsi novo generirani objekti so najprej postavljeni v mlajšo generacijo. Cilj mlajše generacije je, da čim hitreje zberejo predmete s krajšim življenjskim ciklom.

2. Spomin nove generacije je razdeljen na eno regijo Eden in dve coni preživelih (survivor0, survivor1) glede na razmerje 8:1:1. Ena Eden cona, dve Survivor coni (na splošno). Večina predmetov se pojavi na območju Eden. Ko je območje preživelega 0 prav tako polno, se območje eden in območje preživelega 0 kopirata v drugo območje preživelega1, nato se izpraznita območje eden in preživeli0, nato je območje preživelo0 prazno, nato pa se zamenjata območje preživelega 0 in območje preživelega1. To pomeni, da naj območje preživelega1 ostane prazno in tako naprej.

3. Ko območje preživelega 1 ni dovolj za shranjevanje preživelih predmetov iz Edena in preživelega0, se preživeli predmeti shranijo neposredno v staro dobo. Če je tudi starost polna, se sproži popolna GC, torej nova generacija in stara generacija se reciklira

4. GC nove generacije se imenuje tudi Minor GC, pogostost MinorGC pa je razmeroma visoka (ni nujno, da se sproži, ko je območje Eden polno)
Stara generacija

1. Predmeti, ki so še živi po izkušnji recikliranja N smeti pri mlajši generaciji, bodo nameščeni v starejšo generacijo. Zato lahko štejemo, da je stara generacija shranjena v nekaterih predmetih z dolgim življenjskim ciklom.

2. Pomnilnik je tudi veliko večji kot pri novi generaciji (približno razmerje je 1:2), ko je pomnilnik stare dobe poln, se sproži glavni GC, torej poln GC, je frekvenca polnega GC razmeroma nizka, čas preživetja predmeta starosti je razmeroma dolg, meja stopnje preživetja pa visoka.
Stalna generacija
Uporablja se za shranjevanje statičnih datotek, kot so Java razredi, metode itd. Vztrajne generacije nimajo pomembnega vpliva na zbiranje smeti, vendar lahko nekatere aplikacije dinamično generirajo ali kličejo določene razrede, kot je Hibernate itd., in v tem primeru je treba nastaviti razmeroma velik prostor za trajno generiranje, ki shranjuje te nove razrede med izvajanjem.
3. GC (zbiralec smeti)Zbiratelji, ki jih uporablja nova generacija zbirateljev: Serial, PraNew, Parallel Scavenge
Zbiratelji, ki jih uporabljajo starinski zbiratelji: serijski stari, paralelni stari, CMS

Serijski kolektor (algoritem za replikacijo)
Nova generacija enonavojnih zbiralnikov, označevanja in čiščenja, je enonavojna, s prednostjo preprostosti in učinkovitosti.
Serijski stari zbiralec (algoritem za zaključek etiket)
Starinski enonitni zbiralec, starodobna različica serijskega zbiralca.
ParNew collector (algoritem stop-kopiranja)
Nova generacija kolektorja lahko štejemo za večnitno različico serijskega kolektorja, ki ima boljšo zmogljivost kot serijski v večjedrnem CPU okolju.
Paralelni zbiralnik iskanja (algoritem stop-copy)
Paralelni kolektorji za visoko prepustnost in učinkovito izrabo procesorja. Prepustnost je običajno 99 %, prepustnost = čas uporabniške niti / (čas uporabniške niti + GC čas niti). Primeren je za scenarije, kot so aplikacije v ozadju, ki ne zahtevajo visoke interakcije.
Paralelni stari zbiralnik (algoritem stop-copy)
Starejša različica zbiralnika Parallel Scavenge, paralelni kolektor, s prednostjo prepustnosti
CMS (Concurrent Mark Sweep) zbiralnik (Mark-Clean algoritem)
Visoka sočasnost, nizka pavza, doseganje najkrajšega časa za obnovitev GC, visoka poraba procesorja, hiter odzivni čas, kratek čas pavze in večjedrni procesor, ki stremi k visokemu odzivnemu času
4. Mehanizem izvajanja GCKer je bil predmet obdelan v različnih generacijah, se tudi območje in čas zbiranja smeti razlikujeta. Obstajata dve vrsti GC: Scavenge GC in Full GC.
Scavenge GC
Običajno, ko se ustvari nov objekt in ne pridobi prostora v Edenu, se sproži Scavenge GC, ki bo GC označil območje Eden, odstranil nepreživele predmete in premaknil preživele predmete v območje Survivor. Nato razvrsti dve coni Survivorja. GC se na ta način izvaja na območju Eden mlajše generacije in ne vpliva na starejšo generacijo. Ker večina predmetov izvira iz območja Eden in območje Eden ni dodeljeno veliko, se GC območja Eden pogosto izvaja. Zato je na splošno potrebno uporabiti hitre in učinkovite algoritme, da bo Eden čim prej prost.
Polni GC
Organizirajte celoten kup, vključno z mladimi, stalnimi in stalnimi kandidati. Full GC je počasnejši od Scavenge GC, ker zahteva recikliranje celotnega kupa, zato je treba število Full GC čim bolj zmanjšati. Velik del procesa uglaševanja JVM je uglaševanje FullGC. Polna GC je lahko posledica naslednjih razlogov:
1. Redni delovni čas je zapisan v celoti
2. Perm je zapisan v celoti  
3. System.gc() se prikaže kot klic  
4. Strategija dodeljevanja domene v kupu se dinamično spreminja po zadnjem GC
5. Java z GC bo prav tako imela težave z uhajanjem pomnilnika1. Uporaba statičnih razredov zbiranja, kot so HashMap, Vector itd., je najbolj dovzetna za uhajanje pomnilnika, življenjski cikel teh statičnih spremenljivk pa je enak kot pri aplikaciji, in vseh objektov ni mogoče sprostiti, ker jih bodo vedno uporabljali Vector in drugi.
Statični vektor v = nov vektor(); za (int i = 1; i<100; i++) { Object o = novi Object();     v.add(o);     o = nič; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  
V tem primeru je referenca v za vektorski objekt in referenca o za objekt objekt v kodnem skladu. V zanki For nenehno generiramo nove objekte, jih nato dodajamo vektorskemu objektu in nato izničimo o referenco. Vprašanje je, ko je o referenca razveljavljena, ali lahko GC reciklira objekt, ki smo ga ustvarili? Odgovor je ne. Ker ko GC sledi referencam v skladu kode, najde v reference, in če nadaljujete s sledenjem, boste ugotovili, da so reference na objektne objekte v pomnilniškem prostoru, na katere kažejo v reference. To pomeni, da čeprav je o referenca izpraznjena, obstajajo še druge reference na objekt, do katerih je mogoče dostopati, zato jih GC ne more sprostiti. Če po tej zanki objekt Object nima vpliva na program, predpostavimo, da ima Java program uhajanje pomnilnika.
2. Različne povezave, povezave z bazami podatkov, omrežne povezave, IO povezave itd. ne prikazujejo klica blizu ali zaprtega in jih GC ne reciklira, kar povzroča uhajanje pomnilnika.
3. Uporaba poslušalcev lahko povzroči tudi uhajanje pomnilnika, če poslušalec ni izbrisan med sprostitvijo objekta.




Prejšnji:Novinci igrajo nekaj črne tehnologije v CSS
Naslednji:Pazi na programski virus Wanke Cloud Snap Trojan!
Disclaimer:
Vsa programska oprema, programski materiali ali članki, ki jih izdaja Code Farmer Network, so namenjeni zgolj učnim in raziskovalnim namenom; Zgornja vsebina ne sme biti uporabljena v komercialne ali nezakonite namene, sicer uporabniki nosijo vse posledice. Informacije na tej strani prihajajo z interneta, spori glede avtorskih pravic pa nimajo nobene zveze s to stranjo. Zgornjo vsebino morate popolnoma izbrisati z računalnika v 24 urah po prenosu. Če vam je program všeč, podprite pristno programsko opremo, kupite registracijo in pridobite boljše pristne storitve. Če pride do kakršne koli kršitve, nas prosimo kontaktirajte po elektronski pošti.

Mail To:help@itsvse.com