Husk hva søppelinnsamling er i Java

Søppelinnsamling er prosessen med å gjenvinne fullt kjøretidsminne ved å ødelegge ubrukte gjenstander.

Noen ganger kan programmereren glemme å ødelegge ubrukelige objekter, og minnet som er tildelt dem frigjøres ikke. Mer og mer systemminne forbrukes, og til slutt tildeles det ikke mer. Slike applikasjoner lider av "minnelekkasjer".

Etter et visst punkt er det ikke lenger nok minne til å lage nye objekter, og programmet avsluttes unormalt på grunn av OutOfMemoryError .

Søppelinnsamling i Java er prosessen der Java-programmer administrerer minne automatisk. Java-programmer er kompilert til bytekode som kjører på Java Virtual Machine (JVM).

Når Java-programmer kjører på JVM, opprettes objekter på heapen, som er den delen av minnet som er tildelt dem.

Mens en Java-applikasjon kjører, opprettes nye objekter i den. Til slutt er det ikke lenger behov for noen gjenstander. Vi kan si at haugminne til enhver tid består av to typer objekter.

  • Live - Disse objektene brukes, de er referert fra et annet sted.
  • Døde - disse objektene brukes ikke andre steder, det er ingen referanser til dem.

Søppelsamleren finner disse ubrukte gjenstandene og fjerner dem for å frigjøre minne.

Søppelinnsamling i Java er en automatisk prosess . Programmereren trenger ikke eksplisitt merke objekter som skal slettes.

Hver JVM kan implementere sin egen versjon av søppelinnsamling. Samleren må imidlertid samsvare med standard JVM-spesifikasjonen for å håndtere objekter som finnes i haugminnet for å merke eller identifisere uoppnåelige objekter og ødelegge dem via komprimering.

Objektets tilgjengelighet

For å gjenkjenne et objekt som levende, er tilstedeværelsen av lenker ikke nok. Dette er fordi noen døde objekter kan referere til andre døde objekter. Det er derfor det er nødvendig at det blant alle referanser til et objekt skal være minst en fra et "levende" objekt.

Objektets tilgjengelighet

Søppelsamlere jobber med konseptet GC Roots ( garbage collection roots ) for å skille mellom levende og døde gjenstander. Det er 100% levende objekter og fra dem er det lenker som animerer andre objekter og så videre.

Eksempler på slike røtter:

  • Klasser som lastes av systemklasselasteren.
  • Direktesendinger.
  • Parametre for metoder som utføres for øyeblikket og lokale variabler.
  • Objekter som brukes som monitor for synkronisering.
  • Gjenstander som holdes tilbake fra søppelinnsamling for et eller annet formål.
  • Søppelsamleren går gjennom hele grafen over objekter i minnet, starter ved disse røttene og følger referanser til andre objekter.

Søppelinnsamlingstrinn i Java

Standard implementering av søppelinnsamling har tre trinn.

1. Merk objekter som aktive

På dette tidspunktet må søppelsamleren (GC) identifisere alle levende objekter i minnet ved å krysse objektgrafen.

Når den besøker en gjenstand, markerer den den som tilgjengelig og derfor levende. Alle objekter som ikke er tilgjengelige fra GC-røtter regnes som kandidater for søppelinnsamling.

2. Rydding av døde gjenstander

Etter markeringsfasen er minneplassen okkupert av enten levende (besøkte) eller døde (ikke besøkte) objekter. Oppryddingsfasen frigjør minnefragmentene som inneholder disse døde objektene.

3. Kompakt arrangement av de gjenværende objektene i minnet

Det er ikke nødvendig at de døde gjenstandene som ble fjernet i forrige fase, er ved siden av hverandre. Dermed risikerer du å få en fragmentert (halvtom) minneplass.

Men etter å ha sørget for dette, er det selvfølgelig mulig å komprimere minnet i det øyeblikket søppelsamleren fjerner døde gjenstander. Resten vil ligge i en sammenhengende blokk i begynnelsen av haugen.

Komprimeringsprosessen gjør det lettere å sekvensielt allokere minne for nye objekter.