Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 12807|Antwoord: 0

[JavaSE] Krijg een diepgaand begrip van Java's mechanisme voor garbage collection

[Link kopiëren]
Geplaatst op 04-12-2017 20:26:51 | | |
1. Het belang van het afvalrecyclingmechanisme  
Een opvallend kenmerk van de Java-taal is de introductie van een garbage collection-mechanisme, dat het meest problematische geheugenbeheerprobleem voor C++-programmeurs oplost, zodat Java-programmeurs geen geheugenbeheer meer hoeven te overwegen bij het schrijven van programma's. Door het garbage collection-mechanisme hebben objecten in Java niet langer het concept van "scope", alleen de referentie van het object heeft een "scope".Garbage collection kan effectief geheugenlekkage voorkomen en effectief gebruikmaken van ongebruikt geheugen.

ps:内存泄露是指该内存空间使用完毕之后未回收,在不涉及复杂数据结构的一般情况下,Java 的内存泄露表现为一个内存对象的生命周期超出了程序需要它的时间长度,我们有时也将其称为“对象游离”。
2. Algoritmen in mechanismen voor garbage collection  
De Java-taalspecificatie specificeert niet expliciet welk garbage collection-algoritme in de JVM moet worden gebruikt, maar elk garbage collection-algoritme moet over het algemeen twee basisdingen doen: (1) nutteloze informatieobjecten vinden; (2) Het geheugen terugwinnen dat door nutteloze objecten wordt ingenomen, zodat de ruimte opnieuw door het programma kan worden gebruikt.
1. Referentietelling Verzamelaar
1.1 Algoritmeanalyse

Referentietelling is een vroege strategie in garbage collectors. Bij deze aanpak is er een referentietelling voor elke objectinstantie in de heap. Wanneer een object wordt aangemaakt en de objectinstantie aan een variabele wordt toegewezen, wordt het aantal variabelen ingesteld op 1. Wanneer een andere variabele als referentie aan dit object wordt toegewezen, wordt de telling opgeteld met 1 (a = b, dan is de teller van de objectinstantie waarnaar b verwijst +1), maar wanneer een referentie naar een objectinstantie haar levensduur heeft overschreden of op een nieuwe waarde wordt gezet, wordt de referentieteller van de objectinstantie afgetrokken door 1. Elke instantie van een object met een referentieteller van 0 kan als afval worden verzameld. Wanneer een objectinstantie garbage collected wordt uitgevoerd, is de referentieteller van elke objectinstantie die het verwijst min 1.
1.2 Voordelen en nadelen
Verdienen:

De referentietellingverzamelaar kan zeer snel worden uitgevoerd, verweven in de looptijd van het programma. Het is voordelig voor realtime omgevingen waar programma's niet langdurig onderbroken hoeven te worden.
Gebrek:

Circulaire verwijzingen kunnen niet worden gedetecteerd. *Als het ouderobject een verwijzing heeft naar een kindobject, verwijst het kindobject op zijn beurt naar het ouderobject. Op deze manier kan hun citatieaantal nooit 0 zijn.
1.3 Het referentietelalgoritme kan het circulaire referentieprobleem niet oplossen, bijvoorbeeld:
/** * 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 laatste twee zinnen wijzen object1 en object2 toe aan null, wat betekent dat de objecten waar object1 en object2 naar verwezen niet langer toegankelijk zijn, maar omdat ze naar elkaar verwijzen, zijn hun referentietellers niet 0, waardoor de garbage collector ze nooit zal recyclen.
2. Tracing Collector of mark-and-sweep-algoritme
2.1 Wortelzoekalgoritme


Het ROOT-zoekalgoritme is geïntroduceerd uit de grafentheorie in discrete wiskunde; het programma beschouwt alle referentierelaties als een graaf, beginnend bij een knoop GC ROOT, zoekend naar de overeenkomstige referentieknoop, en na het vinden van deze knoop blijft het zoeken naar de referentieknoop van deze knoop; wanneer alle referentieknopen zijn doorzocht, worden de overige knopen beschouwd als niet-gerefereerde knooppunten, dat wil zeggen nutteloze knooppunten.
Java die als GC Root kan worden gebruikt
1. Objecten die worden aangeduid in de virtual machine-stack (lokale variabelen-tabel)
2. Het object dat wordt aangeduid door het statische attribuut in het methodegebied
3. Het object waarnaar wordt verwezen door de constante in het methodegebied
4. Gerefereerde objecten in de lokale methodestack (native objecten)
2.2 Schematisch diagram van het traceeralgoritme

2.3 Analyse van het marker-clearing-algoritme

Het tag-purge-algoritme scant vanuit de rootcollectie, markeert de overgebleven objecten en scant vervolgens de hele ruimte op niet-getagde objecten om te recyclen, zoals te zien is in de bovenstaande figuur. Het tag-purge-algoritme hoeft geen objecten te verplaatsen en verwerkt alleen niet-overlevende objecten, wat uiterst efficiënt is als er veel overlevende objecten zijn, maar omdat het tag-purge-algoritme niet-overlevende objecten direct recyclet, veroorzaakt dit geheugenfragmentatie.
3. Compacteringsalgoritme of label-afwerkingsalgoritme


Het tag-finish algoritme gebruikt dezelfde methode als het tag-clear algoritme om objecten te labelen, maar het is anders bij het zuiveren; nadat de ruimte die door niet-overlevende objecten is ingenomen, wordt alle overgebleven objecten naar de vrije ruimte aan de linkerkant verplaatst en de bijbehorende pointer bijgewerkt. Het tag-finish algoritme is gebaseerd op het tag-purge algoritme en verplaatst objecten, waardoor het duurder is, maar het lost het probleem van geheugenfragmentatie op. Bij de implementatie van collectors op basis van het compacteringsalgoritme worden handles en handles tabellen doorgaans toegevoegd.
4. Kopieeralgoritme (compacte verzamelaar)


Het algoritme wordt voorgesteld om de overhead van het handle te overwinnen en de garbage collection van heap-debris op te lossen. Wanneer het object vol is, scant de garbage collection op basis van het kopieeralgoritme het actieve object uit de wortelset en kopieert elk actief object naar de vrije zijde (zodat er geen vrije gaten zijn tussen het geheugen dat door het actieve object wordt ingenomen), zodat het vrije oppervlak het objectvlak wordt, het oorspronkelijke objectvlak het vrije oppervlak, en het programma geheugen toewijst aan het nieuwe objectvlak. Een typische garbage collection gebaseerd op het coping-algoritme is het stop-and-copy algoritme, dat de heap opdeelt in objectvlakken en vrije oppervlaktevlakken, en het programma pauzeert de uitvoering tijdens het wisselen tussen objectvlakken en vrije gebiedsvlakken.
5. Generatieverzamelaar


De generatie-gezamenlijke afvalrecyclingstrategie is gebaseerd op het feit datDe levenscyclus van verschillende objecten is verschillend。 Daarom kunnen objecten met verschillende levenscycli verschillende recyclingalgoritmen gebruiken om de recyclingefficiëntie te verbeteren.
Jonge Generatie
1. Alle nieuw gegenereerde objecten worden eerst in de jongere generatie geplaatst. Het doel van de jongere generatie is om die objecten met een korte levenscyclus zo snel mogelijk te verzamelen.

2. Het geheugen van de nieuwe generatie is verdeeld in één Eden-regio en twee overlevende (overlevende0, overlevende1) zones volgens de verhouding 8:1:1. Eén Eden-zone, twee overlevendenzones (in het algemeen). De meeste objecten worden gespawnd in het Eden-gebied. Wanneer het survivor0-gebied ook vol is, worden het eden-gebied en het survivor 0-gebied gekopieerd naar een ander survivor1-gebied, waarna het eden- en survivor0-gebied leeg zijn, waarna het survivor0-gebied leeg is, en vervolgens worden het survivor0-gebied en het survivor1-gebied uitgewisseld. Dat wil zeggen, houd het survivor1-gebied leeg, enzovoort.

3. Wanneer het gebied van survivor 1 niet genoeg is om de overgebleven objecten van Eden en survivor0 op te slaan, worden de overgebleven objecten direct opgeslagen in het oude tijdperk. Als de oude leeftijd ook vol is, zal dat een volledige GC activeren, dat wil zeggen, de nieuwe generatie en de oude generatie worden gerecycled

4. De GC van de nieuwe generatie wordt ook Minor GC genoemd, en de frequentie van MinorGC is relatief hoog (het wordt niet noodzakelijk geactiveerd wanneer het Eden-gebied vol is)
Oude Generatie

1. Objecten die nog leven na het ervaren van N-afvalrecycling bij de jongere generatie zullen bij de oudere generatie worden geplaatst. Daarom kan worden aangenomen dat de oude generatie wordt opgeslagen in sommige objecten met een lange levenscyclus.

2. Het geheugen is ook veel groter dan dat van de nieuwe generatie (de geschatte verhouding is 1:2), wanneer het geheugen van de oude leeftijd vol is, wordt de Major GC geactiveerd, dat wil zeggen Volledige GC, is de frequentie van Full GC relatief laag, de overlevingstijd van het oude object relatief lang, en de overlevingskans is hoog.
Permanente Generatie
Gebruikt om statische bestanden op te slaan, zoals Java-klassen, methoden, enzovoort. Persistente generaties hebben geen significante impact op garbage collection, maar sommige applicaties kunnen bepaalde klassen dynamisch genereren of aanroepen, zoals Hibernate, enzovoort, en in dit geval moet er een relatief grote persistent generatieruimte worden ingesteld om deze nieuwe klassen tijdens de runtime op te slaan.
3. GC (Garbage Collector)Verzamelaars gebruikt door de nieuwe generatie verzamelaars: Serial, PraNew, Parallel Scavenge
Verzamelaars gebruikt door Old Age Collectors: Serial Old, Parallel Old, CMS

Seriële verzamelaar (replicatie-algoritme)
De nieuwe generatie enkelvoudige collectors, markering en reiniging is enkeldraads, met als voordeel eenvoudig en efficiënt te zijn.
Seriële oude verzamelaar (label-finish algoritme)
Old Age Single Thread Collector, Old Age versie van Serial Collector.
ParNieuw collector (stop-copy algoritme)
De nieuwe generatie collector kan worden beschouwd als een multithreaded versie van de Seriële Collector, die betere prestaties levert dan Seriële in een multi-core CPU-omgeving.
Parallelle Scavenge Collector (stop-copy algoritme)
Parallelle collectors voor hoge doorvoer en efficiënt gebruik van de CPU. De doorvoersnelheid is over het algemeen 99%, en de doorvoer = gebruikersthreadtijd / (gebruikersthreadtijd + GC-threadtijd). Het is geschikt voor scenario's zoals achtergrondapplicaties die niet veel interactie vereisen.
Parallelle oude verzamelaar (stop-copy algoritme)
Een oudere versie van de Parallel Scavenge-collector, een parallelle collector, met doorvoerprioriteit
CMS (Concurrent Mark Sweep) Collector (Mark-Clean Algoritme)
Hoge gelijktijdigheid, lage pauze, nastreven van de kortste GC-herstelpauzetijd, hoog CPU-gebruik, snelle responstijd, korte pauzetijd, en multi-core CPU die een hoge responstijd nastreeft
4. Het implementatiemechanisme van GCOmdat het object in verschillende generaties is verwerkt, verschillen ook de ruimte en tijd van afvalophaling. Er zijn twee soorten GC: Scavenge GC en Full GC.
Scavenge GC
Normaal gesproken, wanneer een nieuw object wordt gegenereerd en geen ruimte kan aanvragen in Eden, wordt de Scavenge GC geactiveerd, die het Eden-gebied GC, niet-overlevende objecten opruimt en de overgebleven objecten naar het Survivor-gebied verplaatst. Sorteer dan de twee zones van Survivor. GC wordt op deze manier uitgevoerd in het Eden-gebied van de jongere generatie en heeft geen invloed op de oudere generatie. Omdat de meeste objecten beginnen in het Eden-gebied en het Eden-gebied niet veel wordt toegewezen, wordt de GC van het Eden-gebied vaak uitgevoerd. Daarom is het over het algemeen noodzakelijk om hier snelle en efficiënte algoritmen te gebruiken om Eden zo snel mogelijk vrij te maken.
Volledige GC
Organiseer de hele stapel, inclusief Young, Tenured en Perm. Volledige GC is trager dan Scavenge GC omdat het vereist dat de hele stapel wordt gerecycled, dus het aantal Full GCs moet zo veel mogelijk worden verminderd. Een groot deel van het JVM-afstemmingsproces bestaat uit het afstellen van FullGC. Volledige GC kan door de volgende redenen worden veroorzaakt:
1. Vaste aanstelling is volledig opgeschreven
2. Perm wordt volledig geschreven  
3. System.gc() wordt weergegeven als een oproep  
4. De domeinallocatiestrategie van Heap verandert dynamisch na de laatste GC
5. Java met GC zal ook geheugenlekproblemen hebben1. Het gebruik van statische verzamelingsklassen zoals HashMap, Vector, enz. is het meest gevoelig voor geheugenlekkage, en de levenscyclus van deze statische variabelen is gelijk aan die van de applicatie, en alle objecten kunnen niet worden vrijgegeven omdat ze altijd door Vector en anderen worden toegepast.
Statische vector v = nieuwe vector(); voor (int i = 1; i<100; i++) { Object o = nieuw Object();     v.add(o);     o = nul; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  
In dit voorbeeld is er een referentie v voor het Vector-object en een referentie o voor het Object-object in de codestack. In de For-lus blijven we nieuwe objecten genereren, deze vervolgens toevoegen aan het Vector-object, en vervolgens de o-referentie neutraliseren. De vraag is: wanneer de o-referentie wordt geneutraliseerd, als GC optreedt, kan het Object-object dat we hebben gemaakt dan door GC worden gerecycled? Het antwoord is nee. Want wanneer GC referenties in de codestack volgt, vindt het v-referenties, en als je verder zoekt, zul je merken dat er verwijzingen zijn naar objectobjecten in het geheugen waar v-referenties naar worden verwezen. Dit betekent dat, hoewel de o-referentie is verwijderd, er nog steeds andere verwijzingen naar het Objectobject zijn die toegankelijk zijn, waardoor de GC deze niet kan vrijmaken. Als na deze lus het Object-object geen effect meer heeft op het programma, dan gaan we ervan uit dat het Java-programma een geheugenlek heeft.
2. Verschillende verbindingen, databaseverbindingen, netwerkverbindingen, IO-verbindingen, enzovoort, tonen de oproep niet als dicht bij gesloten en worden niet gerecycled door GC, wat leidt tot geheugenlekkage.
3. Het gebruik van luisteraars kan ook geheugenlekken veroorzaken wanneer de luisteraar niet wordt verwijderd tijdens het loslaten van het object.




Vorig:Nieuwkomers spelen wat zwarte technologie in CSS
Volgend:Pas op voor de Wanke Cloud snap software virus Trojaan!
Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com