Denne artikel er en spejling af maskinoversættelse, klik venligst her for at springe til den oprindelige artikel.

Udsigt: 12807|Svar: 0

[JavaSE] Få en dybdegående forståelse af Javas affaldsindsamlingsmekanisme

[Kopier link]
Opslået på 04/12/2017 20.26.51 | | |
1. Betydningen af affaldsgenanvendelsesmekanismen  
En bemærkelsesværdig egenskab ved Java-sproget er introduktionen af en garbage collection-mekanisme, som løser det mest problematiske hukommelsesstyringsproblem for C++-programmører, så Java-programmører ikke længere behøver at tage hensyn til hukommelsesstyring, når de skriver programmer. På grund af garbage collection-mekanismen har objekter i Java ikke længere begrebet "scope", kun objektets reference har et "scope".Garbage Collection kan effektivt forhindre hukommelseslækage og effektivt bruge inaktiv hukommelse.

ps:内存泄露是指该内存空间使用完毕之后未回收,在不涉及复杂数据结构的一般情况下,Java 的内存泄露表现为一个内存对象的生命周期超出了程序需要它的时间长度,我们有时也将其称为“对象游离”。
2. Algoritmer i skraldeindsamlingsmekanismer  
Java-sprogspecifikationen specificerer ikke eksplicit, hvilken garbage collection-algoritme der skal bruges i JVM, men enhver garbage collection-algoritme skal generelt gøre to grundlæggende ting: (1) finde ubrugelige informationsobjekter; (2) Genindtage hukommelsespladsen optaget af ubrugelige objekter, så pladsen kan bruges igen af programmet.
1. Referenceoptællingssamler
1.1 Algoritmeanalyse

Referenceoptælling er en tidlig strategi i skraldesamlere. I denne tilgang er der et referenceantal for hver objektinstans i heapen. Når et objekt oprettes, og objektinstansen tildeles en variabel, sættes variabletællingen til 1. Når en hvilken som helst anden variabel tildeles som reference til dette objekt, lægges antallet sammen med 1 (a = b, så tælleren for objektinstansen, der refereres til af b, er +1), men når en reference til en objektinstans har overskredet sin levetid eller sættes til en ny værdi, trækkes referencetælleren for objektinstansen fra med 1. Enhver forekomst af et objekt med en referencetæller på 0 kan samles som affald. Når en objektinstans bliver garbage collectet, er referencetælleren for enhver objektinstans, den refererer til, minus 1.
1.2 Fordele og ulemper
Fortjeneste:

Reference count-samleren kan udføres meget hurtigt og integreres i programmets kørsel. Det er fordelagtigt i realtidsmiljøer, hvor programmer ikke behøver at blive afbrudt i lange perioder.
Mangel:

Cirkulære referencer kan ikke opdages. *Hvis forældreobjektet har en reference til et børneobjekt, refererer børneobjektet igen til forældreobjektet. På denne måde kan deres citationsantal aldrig være 0.
1.3 Referencetællingsalgoritmen kan ikke løse det cirkulære referenceproblem, for eksempel:
/** * 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
  
De sidste to sætninger tildeler objekt1 og objekt2 til null, hvilket betyder, at objekt1 og objekt2 peger på ikke længere kan tilgås, men fordi de refererer til hinanden, er deres referencetællere ikke 0, så garbage collector vil aldrig genbruge dem.
2. Tracing Collector eller mark-and-sweep-algoritme
2.1 Rodsøgningsalgoritme


Rodsøgningsalgoritmen er introduceret fra grafteori i diskret matematik; programmet betragter alle referencerelationer som en graf, startende fra en node GC ROOT, leder efter den tilsvarende referencenode, efter at have fundet denne node, fortsætter man med at lede efter referencenoden for denne node, og når alle referencenoder er gennemsøgt, betragtes de resterende noder som urefererede noder, det vil sige ubrugelige noder.
Java, der kan bruges som GC-rod
1. Objekter refereret i den virtuelle maskin-stakk (lokale variabletabeller)
2. Objektet, der refereres til af den statiske attribut i metodeområdet
3. Objektet, der refereres til af konstanten i metodeområdet
4. Refererede objekter i den lokale metodestak (native objekter)
2.2 Skematisk diagram af sporingsalgoritmen

2.3 Analyse af markør-clearing-algoritmen

Tag-purge-algoritmen scanner fra rodsamlingen, markerer de overlevende objekter og scanner derefter hele pladsen for umærkede objekter at genbruge, som vist i figuren ovenfor. Tag-purge-algoritmen behøver ikke flytte objekter og behandler kun ikke-overlevende objekter, hvilket er ekstremt effektivt, når der er mange overlevende objekter, men fordi tag-purge-algoritmen direkte genbruger ikke-overlevende objekter, vil det forårsage hukommelsesfragmentering.
3. Kompakteringsalgoritme eller label-finishing-algoritme


Tag-finish-algoritmen bruger samme metode som tag-clear-algoritmen til at mærke objekter, men den er anderledes, når man rydder ud; efter at have generobret pladsen med ikke-overlevende objekter, flytter den alle overlevende objekter til det ledige rum i venstre ende og opdaterer den tilsvarende pointer. Tag-finish-algoritmen er baseret på tag-purge-algoritmen og flytter objekter, så den er dyrere, men den løser problemet med hukommelsesfragmentering. I implementeringen af collectors baseret på kompakteringsalgoritmen tilføjes handles og handles tabeller generelt.
4. Kopieringsalgoritme (kompakteringssamler)


Algoritmen foreslås for at overvinde overhead ved håndtaget og løse garbage collection af heap-debris. Når objektet er fuldt, scanner garbage collection baseret på kopieringsalgoritmen det aktive objekt fra rodsættet og kopierer hvert aktivt objekt til den frie side (så der ikke er frie huller mellem hukommelsen, som det aktive objekt optager), så den frie overflade bliver objektets flade, den oprindelige objektflade bliver den frie flade, og programmet allokerer hukommelse i den nye objektflade. En typisk garbage collection baseret på coping-algoritmen er stop-and-copy-algoritmen, som opdeler heapen i objektflader og frie arealflader, og programmet pauser udførelsen under skiftet mellem objektflader og frie områdeflader.
5. Generationssamler


Den generationelle strategi for genbrug af affald er baseret på, atLivscyklussen for forskellige objekter er forskellig。 Derfor kan genstande med forskellige livscyklusser anvende forskellige genanvendelsesalgoritmer for at forbedre genanvendelseseffektiviteten.
Ung Generation
1. Alle nyligt genererede objekter placeres først i den yngre generation. Målet for den yngre generation er at indsamle disse genstande med en kort livscyklus så hurtigt som muligt.

2. Den nye generations hukommelse er opdelt i én Eden-region og to overlevende (overlevende0, overlevende1) zoner i forhold til 8:1:1. En Eden-zone, to overlevelseszoner (generelt). De fleste objekter spawnes i Eden-området. Når survivor0-området også er fyldt, kopieres eden-området og survivor 0-området til et andet survivor1-område, og så tømmes eden- og survivor0-området, og survivor0-området er tomt, og survivor0-området og survivor1-området byttes ud. Det vil sige, hold survivor1-området tomt, og så videre.

3. Når Survivor 1-området ikke er nok til at opbevare de overlevende genstande fra Eden og Survivor0, opbevares de overlevende objekter direkte til den gamle æra. Hvis alderdommen også er fuld, vil det udløse en fuld GC, det vil sige, at den nye generation og den gamle generation vil blive genanvendt

4. GC'en for den nye generation kaldes også Minor GC, og frekvensen af MinorGC er relativt høj (den udløses ikke nødvendigvis, når Eden-området er fuldt)
Gammel Generation

1. Genstande, der stadig er i live efter at have oplevet N-affaldsgenbrug i den yngre generation, vil blive placeret i den ældre generation. Derfor kan det betragtes som den gamle generation lagret i nogle objekter med en lang livscyklus.

2. Hukommelsen er også meget større end den nye generations (det omtrentlige forhold er 1:2), når hukommelsen om alderdommen er fuld, udløses den store GC, det vil sige fuld GC, er hyppigheden af fuld GC relativt lav, overlevelsestiden for det gamle objekt er relativt lang, og overlevelsesraten er høj.
Permanent Generation
Bruges til at gemme statiske filer, såsom Java-klasser, metoder osv. Persistente genereringer har ingen væsentlig indvirkning på garbage collection, men nogle applikationer kan dynamisk generere eller kalde nogle klasser, såsom Hibernate osv., og i dette tilfælde skal et relativt stort persistent generationsområde sættes til at gemme disse nye klasser under kørsel.
3. GC (Skraldesamler)Samlere brugt af den nye generations samlere: Serial, PraNew, Parallel Scavenge
Samlere brugt af Old Age Collectors: Serial Old, Parallel Old, CMS

Seriel samler (replikationsalgoritme)
Den nye generation af enkelttrådede samlere, markering og rengøring er enkelttrådede, med fordelen af at være simple og effektive.
Seriel gammel samler (label-finish algoritme)
Old Age Single Thread Collector, Old Age version af Serial Collector.
ParNy samler (stop-copy algoritme)
Den nye generation af kollektorer kan betragtes som en multitrådet version af Serial collector, som har bedre ydeevne end Serial i et multi-core CPU-miljø.
Parallel Scavenge Collector (stop-copy algoritme)
Parallelkollektorer for høj gennemstrømning og effektiv CPU-udnyttelse. Gennemstrømningen er generelt 99 %, og gennemstrømningen = brugertrådtid / (brugertrådtid + GC-trådtid). Den er velegnet til scenarier som baggrundsapplikationer, der ikke kræver tilsvarende høj interaktion.
Parallel gammel samler (stop-copy algoritme)
En ældre version af Parallel Scavenge-kollektoren, en parallel kollektor, med gennemstrømningsprioritet
CMS (Concurrent Mark Sweep) Collector (Mark-Clean-algoritme)
Høj samtidighed, lav pause, jagt på den korteste GC-genopretningspausetid, høj CPU-brug, hurtig responstid, kort pausetid og multi-core CPU med høj responstid
4. Implementeringsmekanismen for GCDa objektet er blevet behandlet i forskellige generationer, er området og tidspunktet for affaldsindsamlingen også forskelligt. Der findes to typer GC: Scavenge GC og Full GC.
Scavenge GC
Normalt, når et nyt objekt genereres og ikke ansøger om plads i Eden, vil Scavenge GC blive aktiveret, som vil GC'e Eden-området, rydde ikke-overlevende objekter og flytte de overlevende objekter til Survivor-området. Sorter derefter de to zoner i Survivor. GC udføres på denne måde i Eden-området for den yngre generation og påvirker ikke den ældre generation. Da de fleste objekter starter fra Eden-området, og Eden-området ikke er tildelt særlig meget, udføres GC of the Eden-området ofte. Derfor er det generelt nødvendigt at bruge hurtige og effektive algoritmer her for at gøre Eden fri så hurtigt som muligt.
Fuld GC
Organiser hele bunken, inklusive Young, Tenured og Perm. Fuld GC er langsommere end Scavenge GC, fordi det kræver genanvendelse af hele bunken, så antallet af Full GCs bør reduceres så meget som muligt. En stor del af JVM-tuningprocessen er tuning af FullGC. Fuld GC kan skyldes følgende årsager:
1. Fastansættelse er skrevet fuldt ud
2. Perm skrives fuldt ud  
3. System.gc() vises som et kald  
4. Heaps domæneallokeringsstrategi ændres dynamisk efter den sidste GC
5. Java med GC vil også have hukommelseslækageproblemer1. Brugen af statiske samlingsklasser som HashMap, Vector osv. er mest udsat for hukommelseslækage, og livscyklussen for disse statiske variable er den samme som for applikationen, og alle objekter kan ikke frigives, fordi de altid vil blive anvendt af Vector og andre.
Statisk vektor v = ny vektor(); for (int i = 1; i<100; i++) { Objekt o = nyt Objekt();     v.add(o);     o = null; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  
I dette eksempel er der en reference v for Vector-objektet og en reference o for Object-objektet i kodestakken. I For-løkken bliver vi ved med at generere nye objekter, derefter tilføje dem til Vector-objektet og derefter annullere o-referencen. Spørgsmålet er, når o-referencen annulleres, hvis GC opstår, kan det objekt, vi skabte, så genanvendes af GC? Svaret er nej. For når GC sporer referencer i kodestakken, finder den v-referencer, og hvis du fortsætter med at spore nedad, vil du opdage, at der er referencer til objektobjekter i hukommelsesrummet, som v-referencer peger på. Det betyder, at selvom o-referencen er blevet tømt, er der stadig andre referencer til Objektobjektet, der kan tilgås, så GC kan ikke frigøre dem. Hvis Objektobjektet efter denne løkke ikke har nogen effekt på programmet, antager vi, at Java-programmet har en hukommelseslækage.
2. Forskellige forbindelser, databaseforbindelser, netværksforbindelser, IO-forbindelser osv. viser ikke opkaldet tæt på lukket og bliver ikke genbrugt af GC, hvilket resulterer i hukommelseslækage.
3. Brugen af lyttere kan også forårsage hukommelseslækage, når lytteren ikke slettes, mens objektet frigives.




Tidligere:Nybegyndere spiller noget sort teknologi i CSS
Næste:Pas på Wanke Cloud snap softwarevirus trojaneren!
Ansvarsfraskrivelse:
Al software, programmeringsmaterialer eller artikler udgivet af Code Farmer Network er kun til lærings- og forskningsformål; Ovenstående indhold må ikke bruges til kommercielle eller ulovlige formål, ellers skal brugerne bære alle konsekvenser. Oplysningerne på dette site kommer fra internettet, og ophavsretstvister har intet med dette site at gøre. Du skal slette ovenstående indhold fuldstændigt fra din computer inden for 24 timer efter download. Hvis du kan lide programmet, så understøt venligst ægte software, køb registrering og få bedre ægte tjenester. Hvis der er nogen overtrædelse, bedes du kontakte os via e-mail.

Mail To:help@itsvse.com