This is an old revision of the document!


11. Garbage Collection

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ă.

Principii de funcționare

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:

  • dându-se un obiect, acesta conține pointeri?
  • dându-se un pointer, unde este începutul și sfârșitul obiectului spre care indică pointerul?

Algoritmi de Garbage Collection

Există mai multe tipuri de astfel de algoritmi:

  • secvențiali
    • un singur thread
  • paraleli
    • mai multe thread-uri; posibilitatea de a rula pe mai multe core-uri simultan
  • incrementali
    • în paralel cu execuția programului
    • trebuie să limiteze timpul petrecut într-un pas de GC
  • cu compactare/copiere
    • reduc fragmentarea memoriei
    • cresc gradul de localitate a datelor
    • alocare rapidă (incrementare de pointeri)

Algoritmi secvențiali

cpl/labs/11.1451152845.txt.gz · Last modified: 2015/12/26 20:00 by laura.vasilescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0