„Szemétgyűjtés” változatai közötti eltérés

[ellenőrzött változat][ellenőrzött változat]
Tartalom törölve Tartalom hozzáadva
A szó és a zárójel közé space-t rakunk. A helyesírási hiba kijavítását pedig nem szokás visszavoni. :)
Elírások, nyelvtani hibák, tipográfia javítása egy kicsit, sajnos nem volt időm végigolvasni az oldalt.
6. sor:
* Meghatározni mely objektumok nincsenek már használatban
* Felszabadítani az általuk elfoglalt memóriát
Azáltal, hogy a fejlesztőknek nem kell törődnietörődniük a memória helyes kezelésével, több időt fordíthatnak az alkalmazásfejlesztésre, és a futásidejű hibák száma is csökken, így stabilabb lesz a program. Elkerülhetőek azok a hibák, amelyek az esetlegesen rosszul kezelt memóriából adódtakadódnak (felszabadított objektumra való hivatkozás, lefoglalatlan memóriára való hivatkozás, etc.).
Napjainkban sok programnyelvnek része a szemétgyűjtő ([[C Sharp|C#]], [[Java (programozási nyelv)|Java]], scriptnyelvek), és vannak programnyelvek, amelyeket manuális memóriakezelésre terveztek, de van GC -t alkalmazó implementációjuk (pl.: [[C (programozási nyelv)|C]], [[C++]]). Néhány nyelv - mint a [[Modula-3]] - lehetővé teszi a kettő egyidejű alkalmazását (más-más halmot''' (heap)''' használva).
 
=== Előnyök ===
 
Megszabadítja a programozót a memóriamenedzseléstől, így kiküszöbőlkiküszöböl néhány gyakori hibát:
* Dangling ("lógó") pointer -ek: a mutatott memóriahely már felszabadult, de még van rá hivatkozás
* Többszörös felszabadítás: a már felszabadított memóriát ismét felszabadítja a program
* Memóriaszivárgás (memory leak): a már nem használt memória lefoglalva marad, anélkül, hogy felszabadulna
22. sor:
 
== Nyomkövetés alapú szemétgyűjtés ==
A legelterjedtebb szemétgyűjtő módszer. Először meghatározza, mely objektumok elérhetőek, majd törli a megmaradtakat.
 
=== Egy objektum elérhetősége ===
Egy elérhető objektumot úgy definiálhatunk, mint egy program futása közben létrejött változót, amelyet elérhetünk közvetlenül, vagy egy másik objektumon keresztül. Ezen a módon kétféle objektumot különbözetünkkülönböztetünk meg:
* Objektumok, amelyekről feltételezhetjük, hogy elérhetőek. Tipikusan azok az elemek tartoznak ide, amelyekre a ''call stack'' hivatkozik (azaz minden lokális változó és paraméter egy függvényben), illetve minden globális változó.
* Minden olyan objektum, amelyre egy másik, szintén elérhető objektum hivatkozik (formálisan az elérhetőség egy tranzitív lezárt).
Ez a megközelítés nem optimális, mivel azután, hogy egy objektumra nincs többé szükség, még sok idő telhet el, mire kikerül az adott hatókörből.
 
Különbséget teszünk ''szintaktikai szemét'' (amikor a program nem fér hozzá az objektumhoz) és ''szemantikai szemét'' (azok, amiket többé nem használ a program) között: