Arbejde med generationer af objekter

Java-affaldssamlere implementerer en generationsmæssig affaldsindsamlingsstrategi, der kan klassificere objekter efter alder.

Et sådant behov (at markere og komprimere alle objekter) i JVM kan kaldes ineffektivt. Da et stort antal genstande tildeles, vokser deres liste, hvilket fører til en stigning i affaldsindsamlingstiden. Empirisk analyse af applikationer har vist, at de fleste objekter i Java er kortlivede.

Heap-hukommelsesområdet i JVM er opdelt i tre sektioner:

Arbejde med generationer af objekter

Yngre generation

Nyskabte objekter starter i den yngre generation. Den yngre generation er yderligere opdelt i to kategorier.

  • Eden Space - Alle nye objekter starter her, de er tildelt initial hukommelse.
  • Survivor Spaces (FromSpace og ToSpace) - Objekter flyttes hertil fra Eden efter at have overlevet en affaldsindsamlingscyklus.

Processen, hvor genstande er affald indsamlet fra den yngre generation, kaldes en mindre affaldsindsamlingsbegivenhed.

Når Edens rum er fyldt med genstande, udføres en lille skraldesamling. Alle døde genstande fjernes, og alle levende flyttes til et af de resterende to rum. Den lille GC tjekker også objekter i overlevende rum og flytter dem til et andet (næste) overlevende rum.

Lad os tage følgende sekvens som et eksempel.

  1. Der er genstande af begge typer (levende og døde) i Eden.
  2. En lille GC opstår - alle døde genstande fjernes fra Eden. Alle levende objekter flyttes til rum-1 (FromSpace). Eden og space-2 er nu tomme.
  3. Nye objekter oprettes og tilføjes til Eden. Nogle objekter i Eden og space-1 bliver døde.
  4. En lille GC opstår - alle døde objekter fjernes fra Eden og space-1. Alle levende objekter flyttes til space-2 (ToSpace). Eden og space-1 er tomme.

Således er et af overlevelsesrummene altid tomt til enhver tid. Når overlevende når en vis tærskel for at bevæge sig gennem overlevende rum, avancerer de til en ældre generation.

Du kan bruge -Xmn- flaget til at indstille den unge generations størrelse .

Ældre generation

Objekter, der lever et betydeligt tidsrum (f.eks. det meste af et programs levetid) bliver til sidst ældre genstande - hundredeårige. Den er også kendt som den almindelige generation og indeholder genstande, der har været efterladt i Survivor Spaces i lang tid.

Et objekts levetidsgrænse bestemmer, hvor mange affaldsindsamlingscyklusser det skal igennem, før det flyttes til den ældre generation. Processen, hvor genstande sendes til affaldet fra den ældre generation, kaldes hovedaffaldsindsamlingsbegivenheden.

Du kan bruge flagene -Xms og -Xmx til at indstille den indledende og maksimale heap-hukommelsesstørrelse .

Fordi Java bruger generations-affaldsindsamling, jo flere affaldsindsamlingsbegivenheder et objekt oplever, jo længere bevæger det sig på dyngen. Han starter i den yngre generation og ender til sidst i den almindelige generation, hvis han lever længe nok.

For at forstå promoveringen af ​​objekter mellem rum og generationer, overvej følgende eksempel:

Når et objekt skabes, placeres det først i den unge generations Eden-rum.

Så snart der sker en lille affaldsindsamling, flyttes levende genstande fra Eden til FromSpace. Når den næste mindre affaldsindsamling finder sted, flyttes levende genstande fra både Eden og rummet til ToSpace.

Denne cyklus fortsætter et vist antal gange. Hvis objektet stadig er "i drift" efter dette tidspunkt, vil den næste affaldsindsamlingscyklus flytte det til ældre generations rum.

Permanent generation og metaspace

Metadata som klasser og metoder gemmes i vedvarende generering. JVM'en udfylder den under kørsel baseret på de klasser, der bruges af applikationen. Klasser, der ikke længere bruges, kan gå fra permanent generation til skrald.

Du kan bruge flagene -XX:PermGen og -XX:MaxPermGen til at indstille den oprindelige og maksimale størrelse for den permanente generation .

meta rum

Siden Java 8 er PermGen-rummet blevet erstattet af MetaSpace-hukommelsespladsen. Implementeringen adskiller sig fra PermGen - denne heap-plads ændres nu automatisk.

Dette undgår programmets manglende hukommelsesproblem, der opstår på grund af den begrænsede størrelse af PermGens heap-plads. Metaspace-hukommelse kan opsamles skrald, og klasser, der ikke længere er i brug, bliver automatisk ryddet op, når metaspacet når sin maksimale størrelse.