CodeGym/Java kursus/Modul 3/Affaldsopsamling i Java

Affaldsopsamling i Java

Ledig

Husk, hvad affaldsindsamling er i Java

Skraldesamling er processen med at genvinde fuld runtime-hukommelse ved at ødelægge ubrugte genstande.

Nogle gange kan programmøren glemme at ødelægge ubrugelige objekter, og hukommelsen, der er tildelt dem, frigives ikke. Mere og mere systemhukommelse forbruges, og til sidst tildeles der ikke mere. Sådanne applikationer lider af "hukommelseslækager".

Efter et vist tidspunkt er der ikke længere nok hukommelse til at oprette nye objekter, og programmet afsluttes unormalt på grund af OutOfMemoryError .

Skraldesamling i Java er den proces, hvorved Java-programmer administrerer hukommelsen automatisk. Java-programmer kompileres til bytekode, der kører på Java Virtual Machine (JVM).

Når Java-programmer kører på JVM, oprettes objekter på heapen, som er den del af hukommelsen, der er allokeret til dem.

Mens en Java-applikation kører, oprettes der nye objekter i den. I sidste ende er nogle genstande ikke længere nødvendige. Vi kan sige, at heap-hukommelsen på ethvert givet tidspunkt består af to typer objekter.

  • Live - Disse objekter bruges, de er refereret fra et andet sted.
  • Døde - disse objekter bruges ikke andre steder, der er ingen referencer til dem.

Skraldesamleren finder disse ubrugte genstande og fjerner dem for at frigøre hukommelse.

Affaldsindsamling i Java er en automatisk proces . Programmøren behøver ikke udtrykkeligt at markere objekter, der skal slettes.

Hver JVM kan implementere sin egen version af affaldsindsamling. Samleren skal dog overholde standard JVM-specifikationen for håndtering af genstande, der findes i heap-hukommelsen, for at markere eller identificere uopnåelige genstande og ødelægge dem via komprimering.

Objekt tilgængelighed

For at genkende et objekt som levende, er tilstedeværelsen af ​​links ikke nok. Dette skyldes, at nogle døde genstande kan henvise til andre døde genstande. Derfor er det nødvendigt, at der blandt alle referencer til et objekt skal være mindst én fra et "levende" objekt.

Objekt tilgængelighed

Skraldesamlere arbejder med konceptet GC Roots ( garbage collection roots ) for at skelne mellem levende og døde genstande. Der er 100% levende objekter, og fra dem er der links, der animerer andre objekter og så videre.

Eksempler på sådanne rødder:

  • Klasser, der indlæses af systemklasseindlæseren.
  • Livestreams.
  • Parametre for aktuelt eksekverende metoder og lokale variabler.
  • Objekter, der bruges som monitor til synkronisering.
  • Genstande, der tilbageholdes fra affaldsindsamling til et eller andet formål.
  • Skraldesamleren går gennem hele grafen af ​​objekter i hukommelsen, starter ved disse rødder og følger referencer til andre objekter.

Skraldeindsamlingstrin i Java

Standardimplementeringen af ​​affaldsindsamling har tre trin.

1. Marker objekter som levende

På dette tidspunkt skal garbage collector (GC) identificere alle levende objekter i hukommelsen ved at krydse objektgrafen.

Når den besøger en genstand, markerer den den som tilgængelig og derfor levende. Alle objekter, der ikke er tilgængelige fra GC-rødderne, betragtes som kandidater til affaldsindsamling.

2. Oprydning af døde genstande

Efter opmærkningsfasen er hukommelsespladsen optaget af enten levende (besøgte) eller døde (ikke besøgte) objekter. Oprydningsfasen frigør hukommelsesfragmenterne, der indeholder disse døde objekter.

3. Kompakt arrangement af de resterende objekter i hukommelsen

Det er ikke nødvendigt, at de døde genstande, der blev fjernet i den foregående fase, er ved siden af ​​hinanden. Dermed risikerer du at få et fragmenteret (halvtomt) hukommelsesrum.

Men selvfølgelig, efter at have sørget for dette, er det muligt at komprimere hukommelsen i det øjeblik, hvor affaldssamleren fjerner døde genstande. Resten vil blive placeret i en sammenhængende blok i begyndelsen af ​​bunken.

Komprimeringsprocessen gør det lettere at sekventielt allokere hukommelse til nye objekter.

Kommentarer
  • Populær
  • Ny
  • Gammel
Du skal være logget ind for at skrive en kommentar
Denne side har ingen kommentarer endnu