garbage collection
Főnév
garbage collection (tsz. garbage collections)
- hulladékgyűjtés
- (informatika) automatikus memóriafelszabadítás (szemétgyűjtés)
Mi az a szemétgyűjtés (garbage collection, GC)?
A szemétgyűjtés (garbage collection, GC) egy automatikus memória-kezelési folyamat, amely eltávolítja a már nem használt, elérhetetlen memóriaterületeket egy program futása során. A célja az, hogy megakadályozza a memória-szivárgást és optimalizálja az erőforrások használatát.
A szemétgyűjtést általában magasabb szintű programozási nyelvek használják, mint például: - Java - C# - Python - JavaScript - Go
A C és C++ viszont nem rendelkezik beépített szemétgyűjtővel, ezért itt a programozónak manuálisan kell lefoglalnia (new
, malloc()
) és felszabadítania (delete
, free()
) a memóriát.
Miért van szükség szemétgyűjtésre?
A programok futás közben folyamatosan memóriát foglalnak le objektumok és adatok számára. Ha ezeket a már nem használt erőforrásokat nem szabadítjuk fel, akkor: ✅ A program egyre több memóriát foglal, ami lassuláshoz vagy összeomláshoz vezethet.
✅ Előfordulhat memória-szivárgás, ahol a nem felszabadított memória soha nem kerül vissza az operációs rendszerhez.
✅ A program rosszabb teljesítményt nyújt a feleslegesen foglalt memória miatt.
Hogyan működik a szemétgyűjtés?
A szemétgyűjtő (GC) feladata annak felismerése, hogy mely objektumokra nincs már szükség, és ezeknek az automatikus eltávolítása a memóriából. Az alábbi lépésekből áll:
- Elérhető objektumok azonosítása
- A GC megkeresi azokat az objektumokat, amelyeket még elér a program (például globális változók, veremben lévő objektumok).
- A “szemét” (elérhetetlen objektumok) azonosítása
- Azokat az objektumokat, amelyeket semmilyen változó vagy referencia nem ér el, szemétnek tekinti a rendszer.
- Az elérhetetlen objektumok törlése és memória felszabadítása
- A GC eltávolítja a felesleges objektumokat, és visszaadja a memóriát a rendszernek.
Szemétgyűjtési algoritmusok
A különböző programozási nyelvek különböző GC algoritmusokat alkalmaznak a memória felszabadítására. Íme a leggyakoribb technikák:
1. Referencia számlálás (Reference Counting)
- Minden objektum egy számlálóval rendelkezik, amely nyomon követi, hány referencia mutat rá.
- Ha a referencia száma nullára csökken, az objektumot törölni lehet.
Előnyei:
✅ Hatékony, valós időben működik.
✅ Nem okoz hosszú szüneteket a program futása során.
Hátrányai:
❌ Ciklikus referenciák problémája: ha két objektum egymásra mutat, de más nem hivatkozik rájuk, akkor nem lesznek felszabadítva automatikusan.
Példa Pythonban:
class Node:
def __init__(self):
self.ref = None
a = Node()
b = Node()
a.ref = b
b.ref = a # Ciklikus referencia!
Ebben az esetben a Python szemétgyűjtője speciális módon kezeli a ciklikus referenciákat.
2. Mark-and-Sweep (Megjelölés és törlés)
Ez egy kétlépéses GC algoritmus: 1. Megjelölés (Marking):
- A rendszer bejárja az összes még elérhető objektumot és megjelöli őket.
2. Törlés (Sweep):
- Az összes meg nem jelölt objektum törlődik, és a memória felszabadul.
Előnyei:
✅ Hatékonyan kezeli a ciklikus referenciákat.
✅ Nem szükséges referencia-számlálókat fenntartani.
Hátrányai:
❌ A program végrehajtása közben a szemétgyűjtés megállíthatja a programot, ami késleltetéseket okozhat (ún. “stop-the-world” GC).
Java például ezt az algoritmust használja.
3. Mark-and-Compact (Megjelölés és tömörítés)
Ez egy továbbfejlesztett változata a Mark-and-Sweep algoritmusnak. A különbség az, hogy a megmaradt objektumokat egy helyre tömöríti, hogy a memória fragmentációját csökkentse.
Előnyei:
✅ Csökkenti a memóriaszétaprózódást (fragmentációt).
✅ Javítja a memória kihasználtságát.
Hátrányai:
❌ Még mindig lehet “stop-the-world” szünet, amikor a szemétgyűjtő fut.
4. Generációs szemétgyűjtés (Generational GC)
A modern szemétgyűjtők “generációkra” osztják az objektumokat: - Fiatal generáció (Young Generation) – az újonnan létrehozott objektumok ide kerülnek.
- Öreg generáció (Old Generation) – azok az objektumok, amelyek hosszabb ideig élnek, átkerülnek ide.
A GC gyakrabban fut a fiatal generációban, mert az objektumok többsége gyorsan elavul.
Előnyei:
✅ Gyorsabb, mert nem kell minden objektumot mindig ellenőrizni.
✅ A program teljesítményére kisebb hatással van.
Java és Python ezt a megközelítést használja.
Garbage Collection a különböző nyelvekben
Nyelv | Van beépített GC? | GC Típusa |
---|---|---|
C | ❌ (Nincs) | Manuális memória kezelés (malloc/free )
|
C++ | ❌ (Nincs) | Manuális (new/delete ), vagy smart pointers (unique_ptr , shared_ptr )
|
Java | ✅ (Van) | Mark-and-Sweep, Generational GC |
Python | ✅ (Van) | Referencia számlálás + Generational GC |
C# | ✅ (Van) | Mark-and-Compact, Generational GC |
JavaScript | ✅ (Van) | Mark-and-Sweep |
Hátrányai a szemétgyűjtésnek
Bár a GC nagyban megkönnyíti a memória-kezelést, vannak hátrányai is: ❌ Teljesítménycsökkenést okozhat, mert a program futása közben hirtelen belassulhat (ha a GC elindul).
❌ Nem mindig kiszámítható, hogy mikor fog futni.
❌ Nagy memóriahasználatot eredményezhet, mivel a memória felszabadítás nem azonnal történik.
Összegzés
- A garbage collection automatikusan kezeli a memóriát, hogy elkerülje a memória-szivárgásokat.
- Gyakori algoritmusok: Referencia számlálás, Mark-and-Sweep, Mark-and-Compact, Generational GC.
- Előnyei: Nincs manuális memória-felszabadítás, kevesebb hiba.
- Hátrányai: Teljesítménycsökkenés, nem mindig kiszámítható működés.
- garbage collection - Szótár.net (en-hu)
- garbage collection - Sztaki (en-hu)
- garbage collection - Merriam–Webster
- garbage collection - Cambridge
- garbage collection - WordNet
- garbage collection - Яндекс (en-ru)
- garbage collection - Google (en-hu)
- garbage collection - Wikidata
- garbage collection - Wikipédia (angol)