CodeGym/Java kurs/Modul 3/Generasjons søppelinnsamling

Generasjons søppelinnsamling

Tilgjengelig

Arbeid med generasjoner av objekter

Java søppelsamlere implementerer en generasjonsstrategi for søppelinnsamling som kan klassifisere objekter etter alder.

Et slikt behov (for å merke og komprimere alle objekter) i JVM kan kalles ineffektivt. Siden et stort antall gjenstander blir tildelt, vokser listen deres, noe som fører til en økning i søppelinnsamlingstiden. Empirisk analyse av applikasjoner har vist at de fleste objekter i Java er kortvarige.

Heap-minneområdet i JVM er delt inn i tre seksjoner:

Arbeid med generasjoner av objekter

Yngre generasjon

Nyskapte objekter starter i den yngre generasjonen. Den yngre generasjonen er videre delt inn i to kategorier.

  • Eden Space - Alle nye objekter starter her, de er tildelt initialminne.
  • Survivor Spaces (FromSpace og ToSpace) - Objekter flyttes hit fra Eden etter å ha overlevd en søppelsamlingssyklus.

Prosessen når gjenstander er søppel samlet inn fra den yngre generasjonen kalles en mindre søppelinnsamlingshendelse.

Når Edens plass er fylt med gjenstander, utføres en liten søppelsamling. Alle døde gjenstander fjernes, og alle levende flyttes til en av de to gjenværende plassene. Den lille GC sjekker også gjenstander i overlevende rom og flytter dem til et annet (neste) overlevende rom.

La oss ta følgende sekvens som et eksempel.

  1. Det er gjenstander av begge typer (levende og døde) i Eden.
  2. En liten GC oppstår - alle døde gjenstander fjernes fra Eden. Alle levende objekter flyttes til space-1 (FromSpace). Eden og space-2 er nå tomme.
  3. Nye objekter opprettes og legges til Eden. Noen gjenstander i Eden og space-1 blir døde.
  4. En liten GC oppstå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.

Dermed er en av overlevende-plassene alltid tom når som helst. Når overlevende når en viss terskel for å bevege seg gjennom overlevende rom, avanserer de til en eldre generasjon.

Du kan bruke -Xmn- flagget til å angi den unge generasjonens størrelse .

Eldre generasjon

Objekter som lever en betydelig mengde tid (for eksempel mesteparten av levetiden til et program) blir til slutt eldre objekter - hundreåringer. Den er også kjent som den vanlige generasjonen og inneholder gjenstander som har blitt liggende i Survivor Spaces i lang tid.

Et objekts levetidsterskel avgjør hvor mange søppelhentingssykluser den må gjennom før den flyttes til den eldre generasjonen. Prosessen når gjenstander sendes til søppelet fra den eldre generasjonen kalles hovedsøppelhentingshendelsen.

Du kan bruke flaggene -Xms og -Xmx for å angi den opprinnelige og maksimale haugminnestørrelsen .

Fordi Java bruker generasjonsbasert søppelinnsamling, jo flere søppelinnsamlingshendelser et objekt opplever, jo lenger beveger det seg på haugen. Han starter i den yngre generasjonen og havner til slutt i den vanlige generasjonen hvis han lever lenge nok.

For å forstå promoteringen av objekter mellom rom og generasjoner, bør du vurdere følgende eksempel:

Når et objekt skapes, plasseres det først i Eden-rommet til den unge generasjonen.

Så snart en liten søppelsamling skjer, flyttes levende gjenstander fra Eden til FromSpace. Når den neste mindre søppelsamlingen skjer, flyttes levende gjenstander fra både Eden og verdensrommet til ToSpace.

Denne syklusen fortsetter et visst antall ganger. Hvis objektet fortsatt er "i bruk" etter dette punktet, vil neste søppelinnsamlingssyklus flytte det til eldre generasjonsrom.

Permanent generasjon og metaspace

Metadata som klasser og metoder lagres i vedvarende generering. JVM fyller den ut under kjøretid basert på klassene som brukes av applikasjonen. Klasser som ikke lenger brukes kan gå fra permanent generasjon til søppel.

Du kan bruke flaggene -XX:PermGen og -XX:MaxPermGen for å angi den opprinnelige og maksimale størrelsen på den permanente generasjonen .

meta-rom

Siden Java 8 har PermGen-plassen blitt erstattet av MetaSpace-minneplassen. Implementeringen skiller seg fra PermGen - denne haugplassen endres nå automatisk.

Dette unngår programmets problem med ut-av-minnet som oppstår på grunn av den begrensede størrelsen på PermGens haugplass. Metaspace-minne kan samles opp, og klasser som ikke lenger er i bruk vil automatisk bli ryddet opp når metaspacet når sin maksimale størrelse.

Kommentarer
  • Populær
  • Ny
  • Gammel
Du må være pålogget for å legge igjen en kommentar
Denne siden har ingen kommentarer ennå