Emlékezzünk vissza, mi a szemétgyűjtés a Java nyelven

A szemétgyűjtés a teljes futásidejű memória visszanyerésének folyamata a nem használt objektumok megsemmisítésével.

Előfordulhat, hogy a programozó elfelejti megsemmisíteni a haszontalan objektumokat, és a hozzájuk rendelt memória nem szabadul fel. Egyre több rendszermemória kerül felhasználásra, és végül nem foglalnak le többet. Az ilyen alkalmazások „memóriaszivárgástól” szenvednek.

Egy bizonyos pont után már nincs elég memória új objektumok létrehozásához, és a program rendellenesen leáll az OutOfMemoryError miatt .

A Java szemétgyűjtése az a folyamat, amellyel a Java programok automatikusan kezelik a memóriát. A Java programokat bájtkódba fordítják, amely a Java virtuális gépen (JVM) fut.

Amikor a Java programok futnak a JVM-en, az objektumok a kupacban jönnek létre, amely a memória számukra lefoglalt része.

Miközben egy Java alkalmazás fut, új objektumok jönnek létre benne. Végül egyes tárgyakra már nincs szükség. Azt mondhatjuk, hogy a kupacmemória bármely adott időpontban kétféle objektumból áll.

  • Élő – Ezeket az objektumokat használják, máshonnan hivatkoznak rájuk.
  • Halott – ezeket az objektumokat sehol máshol nem használják, nincs rájuk hivatkozás.

A szemétgyűjtő megtalálja ezeket a nem használt tárgyakat, és eltávolítja őket, hogy memória szabadítson fel.

A Java szemétgyűjtése egy automatikus folyamat . A programozónak nem kell kifejezetten megjelölnie a törölni kívánt objektumokat.

Minden JVM megvalósíthatja a saját szemétgyűjtési verzióját. A gyűjtőnek azonban meg kell felelnie a halommemóriában lévő objektumok kezelésére vonatkozó szabványos JVM specifikációnak, hogy megjelölje vagy azonosítsa az elérhetetlen objektumokat, és tömörítéssel megsemmisítse azokat.

Objektum elérhetősége

Ahhoz, hogy egy tárgyat élőként ismerjünk fel, nem elegendő a hivatkozások jelenléte. Ennek az az oka, hogy egyes holt objektumok más holt objektumokra utalhatnak. Ezért szükséges, hogy az objektumra való hivatkozások között legyen legalább egy „élő” objektum.

Objektum elérhetősége

A szemétgyűjtők a GC Roots ( szemétgyűjtő gyökerek ) koncepciójával dolgoznak , hogy különbséget tegyenek élő és holt tárgyak között. Vannak 100%-ban élő objektumok, és tőlük vannak olyan hivatkozások, amelyek más objektumokat animálnak és így tovább.

Példák az ilyen gyökerekre:

  • Osztályok, amelyeket a rendszerosztály-betöltő tölt be.
  • Élő közvetítések.
  • A jelenleg futó metódusok és helyi változók paraméterei.
  • A szinkronizáláshoz monitorként használt objektumok.
  • Olyan tárgyak, amelyeket valamilyen célra visszatartanak a szemétgyűjtésből.
  • A szemétgyűjtő végigjárja a memóriában lévő objektumok teljes grafikonját, ezektől a gyökerektől kezdve, és követi a más objektumokra való hivatkozásokat.

A szemétgyűjtés lépései Java nyelven

A szabványos szemétgyűjtési megvalósítás három lépésből áll.

1. Jelölje meg az objektumokat élőként

Ezen a ponton a szemétgyűjtőnek (GC) azonosítania kell a memóriában lévő összes élő objektumot az objektumgráf bejárásával.

Amikor meglátogat egy objektumot, elérhetőnek, tehát élőnek jelöli meg. Minden olyan objektum, amely nem érhető el a GC-gyökerekből, szemétgyűjtésre jelöltnek minősül.

2. Elhalt tárgyak eltakarítása

A jelölési fázis után a memóriateret élő (látogatott) vagy holt (nem látogatott) objektumok foglalják el. A tisztítási fázis felszabadítja azokat a memóriatöredékeket, amelyek ezeket az elhalt objektumokat tartalmazzák.

3. A fennmaradó objektumok kompakt elrendezése a memóriában

Nem szükséges, hogy az előző fázisban eltávolított holt tárgyak egymás mellett legyenek. Így azt kockáztatja, hogy töredezett (félig üres) memóriaterületet kap.

De természetesen, ha erről gondoskodtunk, lehetséges a memória tömörítése abban a pillanatban, amikor a szemétgyűjtő eltávolítja az elhalt tárgyakat. A többi egy összefüggő blokkban lesz a kupac elején.

A tömörítési folyamat megkönnyíti a memória szekvenciális lefoglalását az új objektumok számára.