CodeGym/Java Course/Module 3/Generatie afvalinzameling

Generatie afvalinzameling

Beschikbaar

Werken met generaties objecten

Java Garbage Collectors implementeren een Generational Garbage Collection-strategie die objecten op leeftijd kan classificeren.

Een dergelijke behoefte (om alle objecten te markeren en te comprimeren) in de JVM kan inefficiënt worden genoemd. Aangezien een groot aantal objecten wordt toegewezen, groeit hun lijst, wat leidt tot een toename van de afvalophaaltijd. Empirische analyse van applicaties heeft aangetoond dat de meeste objecten in Java van korte duur zijn.

Het heap-geheugengebied in de JVM is verdeeld in drie secties:

Werken met generaties objecten

Jongere generatie

Nieuw gemaakte objecten beginnen bij de jongere generatie. De jongere generatie is verder onderverdeeld in twee categorieën.

  • Eden Space - Alle nieuwe objecten beginnen hier, ze krijgen een initieel geheugen toegewezen.
  • Survivor Spaces (FromSpace en ToSpace) - Objecten worden hierheen verplaatst vanuit Eden nadat ze één vuilnisophaalcyclus hebben overleefd.

Het proces waarbij objecten van de jongere generatie worden opgehaald, wordt een kleine ophaalgebeurtenis genoemd.

Wanneer de ruimte van Eden gevuld is met objecten, wordt er een kleine afvalinzameling uitgevoerd. Alle dode voorwerpen worden verwijderd en alle levende voorwerpen worden verplaatst naar een van de resterende twee velden. De kleine WG controleert ook objecten in het overlevingsveld en verplaatst ze naar een ander (volgend) overlevingsveld.

Laten we de volgende reeks als voorbeeld nemen.

  1. Er zijn objecten van beide typen (levend en dood) in Eden.
  2. Er vindt een kleine GC plaats - alle dode objecten worden uit Eden verwijderd. Alle levende objecten worden verplaatst naar ruimte-1 (FromSpace). Eden en spatie-2 zijn nu leeg.
  3. Er worden nieuwe objecten gemaakt en toegevoegd aan Eden. Sommige objecten in Eden en space-1 worden dood.
  4. Er vindt een kleine GC plaats - alle dode objecten worden verwijderd uit Eden en ruimte-1. Alle levende objecten worden verplaatst naar ruimte-2 (ToSpace). Eden en spatie-1 zijn leeg.

Zo is op elk moment een van de overlevende velden altijd leeg. Wanneer overlevenden een bepaalde drempel bereiken om door overlevingsruimten te gaan, gaan ze door naar een oudere generatie.

U kunt de vlag -Xmn gebruiken om de grootte van de jonge generatie in te stellen .

Oudere generatie

Objecten die een aanzienlijke hoeveelheid tijd meegaan (bijvoorbeeld het grootste deel van de levensduur van een programma) worden uiteindelijk oudere objecten - honderdjarigen. Het staat ook bekend als de reguliere generatie en bevat objecten die lange tijd in Survivor Spaces zijn achtergelaten.

De levensduurdrempel van een object bepaalt hoeveel cycli van afvalinzameling het moet doorlopen voordat het naar de oudere generatie wordt verplaatst. Het proces waarbij objecten van de oudere generatie naar de prullenbak worden gestuurd, wordt de belangrijkste opschoningsgebeurtenis genoemd.

U kunt de vlaggen -Xms en -Xmx gebruiken om de initiële en maximale grootte van het heapgeheugen in te stellen .

Omdat Java gebruikmaakt van generatie-garbagecollection, geldt dat hoe meer garbagecollection-gebeurtenissen een object ervaart, hoe verder het op de heap komt. Hij begint in de jongere generatie en eindigt uiteindelijk in de reguliere generatie als hij lang genoeg leeft.

Bekijk het volgende voorbeeld om de promotie van objecten tussen ruimtes en generaties te begrijpen:

Wanneer een object wordt gemaakt, wordt het eerst in de Eden-ruimte van de jonge generatie geplaatst.

Zodra er een kleine afvalinzameling plaatsvindt, worden levende objecten uit Eden verplaatst naar FromSpace. Wanneer de volgende kleine afvalinzameling plaatsvindt, worden levende objecten uit zowel Eden als de ruimte verplaatst naar ToSpace.

Deze cyclus gaat een bepaald aantal keren door. Als het object na dit punt nog steeds "in gebruik" is, zal de volgende afvalinzamelingscyclus het naar de oudere generatieruimte verplaatsen.

Permanente generatie en metaruimte

Metadata zoals klassen en methoden worden opgeslagen in persistente generatie. De JVM vult het tijdens runtime op basis van de klassen die door de toepassing worden gebruikt. Klassen die niet langer worden gebruikt, kunnen van permanente generatie naar afval gaan.

U kunt de vlaggen -XX:PermGen en -XX:MaxPermGen gebruiken om de initiële en maximale grootte van de permanente generatie in te stellen .

meta-ruimte

Sinds Java 8 is de PermGen-ruimte vervangen door de MetaSpace-geheugenruimte. De implementatie verschilt van PermGen - deze heapruimte wordt nu automatisch gewijzigd.

Dit voorkomt het geheugenprobleem van de toepassing dat optreedt als gevolg van de beperkte grootte van de heapruimte van PermGen. Metaspace-geheugen kan worden opgeschoond en klassen die niet langer in gebruik zijn, worden automatisch opgeschoond wanneer de metaspace de maximale grootte bereikt.

Opmerkingen
  • Populair
  • Nieuw
  • Oud
Je moet ingelogd zijn om opmerkingen te kunnen maken
Deze pagina heeft nog geen opmerkingen