CodeGym/Java kurs/Modul 3/Sophämtning i Java

Sophämtning i Java

Nivå, Lektion
Tillgängliga

Kom ihåg vad sophämtning är i Java

Sophämtning är processen att återta fullt körtidsminne genom att förstöra oanvända föremål.

Ibland kan programmeraren glömma att förstöra värdelösa föremål, och minnet som tilldelats dem frigörs inte. Mer och mer systemminne förbrukas, och så småningom allokeras inte mer. Sådana applikationer lider av "minnesläckor".

Efter en viss tidpunkt finns det inte längre tillräckligt med minne för att skapa nya objekt och programmet avslutas onormalt på grund av OutOfMemoryError .

Sophämtning i Java är den process genom vilken Java-program hanterar minne automatiskt. Java-program kompileras till bytekod som körs på Java Virtual Machine (JVM).

När Java-program körs på JVM skapas objekt på heapen, vilket är den del av minnet som tilldelats dem.

Medan en Java-applikation körs skapas nya objekt i den. I slutändan behövs vissa föremål inte längre. Vi kan säga att högminne vid varje given tidpunkt består av två typer av objekt.

  • Live - Dessa objekt används, de refereras från någon annanstans.
  • Döda - dessa objekt används inte någon annanstans, det finns inga referenser till dem.

Sopsamlaren hittar dessa oanvända föremål och tar bort dem för att frigöra minne.

Sophämtning i Java är en automatisk process . Programmeraren behöver inte uttryckligen markera objekt som ska raderas.

Varje JVM kan implementera sin egen version av sophämtning. Samlaren måste dock följa standard JVM-specifikationen för att hantera objekt som finns i högminne för att markera eller identifiera oåtkomliga objekt och förstöra dem genom komprimering.

Objekt nåbarhet

För att känna igen ett objekt som levande räcker det inte med länkar. Detta beror på att vissa döda föremål kan referera till andra döda föremål. Det är därför det är nödvändigt att det bland alla referenser till ett objekt ska finnas minst en från ett "levande" objekt.

Objekt nåbarhet

Garbage collectors arbetar med konceptet GC Roots ( garbage collection roots ) för att kunna skilja på levande och döda föremål. Det finns 100% levande objekt och från dem finns länkar som animerar andra objekt och så vidare.

Exempel på sådana rötter:

  • Klasser som laddas av systemklassladdaren.
  • Liveströmmar.
  • Parametrar för metoder som körs för närvarande och lokala variabler.
  • Objekt som används som monitor för synkronisering.
  • Föremål som hålls kvar från sophämtning för något ändamål.
  • Sopsamlaren går igenom hela grafen över objekt i minnet, med början vid dessa rötter och följer referenser till andra objekt.

Steg för sophämtning i Java

Standardimplementeringen av sophämtning har tre steg.

1. Markera objekt som live

Vid denna tidpunkt måste sopsamlaren (GC) identifiera alla levande objekt i minnet genom att korsa objektgrafen.

När den besöker ett objekt markerar den det som tillgängligt och därför levande. Alla objekt som inte är tillgängliga från GC-rötterna anses vara kandidater för sophämtning.

2. Rensa upp döda föremål

Efter uppmärkningsfasen är minnesutrymmet upptaget av antingen levande (besökta) eller döda (ej besökta) objekt. Rensningsfasen frigör minnesfragmenten som innehåller dessa döda objekt.

3. Kompakt arrangemang av de återstående objekten i minnet

Det är inte nödvändigt att de döda föremålen som togs bort i föregående fas är bredvid varandra. Därmed riskerar du att få ett fragmenterat (halvtomt) minnesutrymme.

Men, naturligtvis, efter att ha sörjt för detta, är det möjligt att komprimera minnet i det ögonblick när sophämtaren tar bort döda föremål. Resten kommer att ligga i ett sammanhängande block i början av högen.

Komprimeringsprocessen gör det lättare att sekventiellt allokera minne för nya objekt.

Kommentarer
  • Populär
  • Ny
  • Gammal
Du måste vara inloggad för att lämna en kommentar
Den här sidan har inga kommentarer än