This is an old revision of the document!
Termenul de Garbage Collection (gc) se referă la algoritmii de eliberare implicită a memoriei dinamice sau, altfel spus, de colectare a zonelor de memorie devenite inaccesibile.
Zonele care pot să fie eliberate (garbage) sunt zone de memorie la care nu se mai poate ajunge prin intermediul unui pointer sau eventual a unei succesiuni de pointeri accesibili. Despre aceste zone se spune că sunt inaccesibile spre deosebire de zonele care sunt accesibile şi despre care se spune că sunt în viaţă.
Iniţial aceste tehnici au apărut în legătură cu limbajele de tip Lisp pentru care alocarea memoriei se face implicit. În prezent se încearcă utilizarea acestor tehnici și pentru limbajele care utilizează alocarea explicită a memoriei dinamice (C, C++). Limbaje mai noi, precum Java, au fost proiectate pentru a putea să utilizeze această tehnică.
GC se execută, de regulă, când nu mai este memorie liberă disponibilă. Trebuie să rezolve două probleme: să identifice zonele nefolosite într-un mod conservativ și să elibereze zonele identificate.
Identificarea zonelor de memorie în viață se face pornind de la variabilele accesibile (mulțime rădăcină) atunci când se execută colectarea memoriei. Mulțimea rădăcină este formată din variabilele globale, variabilele locale din stiva curentă și registre. Pornind de la această mulțime și parcurgând obiectele accesibile prin intermediul unor pointeri se pot identifica obiectele accesibile. Tot ce nu este accesibil în acest fel reprezintă zona inaccesibilă (garbage).
Pentru a identifica aceste zone, trebuie să existe o strategie pentru a răspunde la două întrebări:
Există mai multe tipuri de astfel de algoritmi:
Numără referințele unui obiect. Când un obiect ajunge la zero referințe, acesta este eliberat.
Este un algoritm simplu, însă dezavantajul este că nu poate elibera structuri ciclice.
Parcurge întreaga zonă de memorie dinamică (heap) identificând zonele care nu mai sunt în viață, după care le eliberează. Acest algoritm nu realizează compactarea spațiului disponibil, existând un alt algoritm, Compacting Mark and Sweep, care adaugă un pas separat pentru acest lucru. Compactarea poate fi rapidă existând un vector în care sunt stocați pointerii către obiecte, referințele fiind indecșii în vector.
Algoritmul copiază zonele rămase în viață într-un spațiu nou. Acesta realizează implicit și compactarea spațiului disponibil.