Bedenk wat garbage collection is in Java
Garbage collection is het proces waarbij het volledige runtime-geheugen wordt teruggevorderd door ongebruikte objecten te vernietigen.
Soms vergeet de programmeur nutteloze objecten te vernietigen en wordt het geheugen dat eraan is toegewezen niet vrijgemaakt. Er wordt steeds meer systeemgeheugen verbruikt en uiteindelijk wordt er niet meer toegewezen. Dergelijke applicaties hebben last van "geheugenlekken".
Na een bepaald punt is er niet langer genoeg geheugen om nieuwe objecten te maken en wordt het programma abnormaal beëindigd vanwege OutOfMemoryError .
Garbage collection in Java is het proces waarbij Java-programma's het geheugen automatisch beheren. Java-programma's worden gecompileerd in bytecode die draait op de Java Virtual Machine (JVM).
Wanneer Java-programma's op de JVM worden uitgevoerd, worden objecten gemaakt op de heap, het deel van het geheugen dat eraan is toegewezen.
Terwijl een Java-toepassing draait, worden er nieuwe objecten in gemaakt. Uiteindelijk zijn sommige objecten niet meer nodig. We kunnen zeggen dat heap-geheugen op elk moment uit twee soorten objecten bestaat.
- Live - Deze objecten worden gebruikt, er wordt ergens anders naar verwezen.
- Dood - deze objecten worden nergens anders gebruikt, er zijn geen verwijzingen naar.
De vuilnisman vindt deze ongebruikte objecten en verwijdert ze om geheugen vrij te maken.
Garbage collection in Java is een automatisch proces . De programmeur hoeft niet expliciet objecten te markeren die moeten worden verwijderd.
Elke JVM kan zijn eigen versie van garbage collection implementeren. De collector moet echter voldoen aan de standaard JVM-specificatie voor het omgaan met objecten in het heap-geheugen om onbereikbare objecten te markeren of te identificeren en ze te vernietigen door middel van verdichting.
Bereikbaarheid van objecten
Om een object als levend te herkennen, is de aanwezigheid van links niet voldoende. Dit komt omdat sommige dode objecten kunnen verwijzen naar andere dode objecten. Daarom is het noodzakelijk dat er tussen alle verwijzingen naar een object minstens één van een "levend" object is.
Vuilnismannen werken met het concept van GC Roots ( garbage collection roots ) om onderscheid te maken tussen levende en dode objecten. Er zijn 100% levende objecten en van hen zijn er links die andere objecten animeren, enzovoort.
Voorbeelden van dergelijke wortels:
- Klassen die worden geladen door de systeemklasselader.
- Livestreams.
- Parameters van methoden die momenteel worden uitgevoerd en lokale variabelen.
- Objecten die worden gebruikt als monitor voor synchronisatie.
- Voorwerpen die voor een bepaald doel uit de afvalinzameling worden bewaard.
- De vuilnisophaler doorloopt de hele grafiek van objecten in het geheugen, beginnend bij deze wortels en vervolgens verwijzingen naar andere objecten.
Stappen voor het verzamelen van afval in Java
De standaard implementatie van garbage collection bestaat uit drie stappen.
1. Markeer objecten als levend
Op dit punt moet de vuilnisman (GC) alle levende objecten in het geheugen identificeren door de objectgrafiek te doorlopen.
Wanneer het een object bezoekt, markeert het het als beschikbaar en dus levend. Alle objecten die niet toegankelijk zijn vanuit de GC-roots worden beschouwd als kandidaten voor afvalophaling.
2. Dode voorwerpen opruimen
Na de opmaakfase wordt de geheugenruimte ingenomen door levende (bezochte) of dode (niet bezochte) objecten. De opruimfase bevrijdt de geheugenfragmenten die deze dode objecten bevatten.
3. Compacte opstelling van de resterende objecten in het geheugen
De dode voorwerpen die in de vorige fase zijn verwijderd hoeven niet naast elkaar te liggen. U loopt dus het risico een gefragmenteerde (halflege) geheugenruimte te krijgen.
Maar als hiervoor is gezorgd, is het natuurlijk mogelijk om het geheugen te comprimeren op het moment dat de vuilnisman dode voorwerpen verwijdert. De rest komt in een aaneengesloten blok aan het begin van de heap.
Het verdichtingsproces maakt het gemakkelijker om achtereenvolgens geheugen toe te wijzen voor nieuwe objecten.
GO TO FULL VERSION