Ce este colectarea gunoiului?

În termeni generali, colecția de gunoi (GC) nu este altceva decât colectarea sau câștigarea de memorie care a fost alocată obiectelor, dar care nu este în prezent utilizată în nicio parte a programului nostru.

Să intrăm în mai multe detalii. Colectarea gunoiului este procesul prin care programele încearcă să elibereze spațiu de memorie care nu mai este folosit de obiecte.

Colectarea gunoiului este implementată diferit pentru fiecare limbă. Majoritatea limbajelor de programare la nivel înalt au încorporat un fel de colectare a gunoiului. Limbajele de programare la nivel scăzut pot adăuga colectarea gunoiului prin biblioteci.

După cum sa spus mai sus, fiecare limbaj de programare are propriul mod de a efectua GC. În programarea C, dezvoltatorii trebuie să aibă grijă de alocarea și dealocarea memoriei folosind funcțiile malloc () și dealloc (). Dar, în cazul dezvoltatorilor C #, nu este nevoie să aibă grijă de GC și nici nu este recomandat.

Cum se întâmplă alocarea memoriei?

În C #, alocarea de memorie a obiectelor se întâmplă într-o grămadă gestionată, de care se ocupă CLR (runtime de limbaj comun). Alocarea memoriei pentru heap se face prin win32 dll în sistemul de operare și în mod similar în C.

ad-banner

Dar, în C obiectele sunt plasate în memorie oriunde există spațiu liber care se potrivește cu dimensiunea obiectului. De asemenea, cartografierea memoriei funcționează pe baza conceptelor Linkedlist. În C #, alocarea memoriei pentru heap se întâmplă într-o manieră liniară, una după alta.

Ori de câte ori este creat un obiect nou, memoria este alocată în heap și indicatorul este mutat la următoarea adresă de memorie. Alocarea memoriei în C # este mai rapidă decât în ​​C. Acest lucru se datorează faptului că în C memoria trebuie să caute și să aloce obiectul. Deci va dura ceva mai mult timp decât C #.

Generații în C # GC

În programarea .net, heap-ul are trei generații numite generații 0, 1 și 2. Generația 0 se umple mai întâi ori de câte ori este creat un nou obiect. Apoi, colectorul de gunoi rulează atunci când generația 0 se umple. Obiectele nou create sunt plasate în generația 0.

În timp ce efectuați colectarea gunoiului, toate obiectele nedorite sunt distruse, astfel încât memoria este eliberată și compactată. GC are grijă să arate indicatorii memoriei eliberate odată ce GC se întâmplă.

Generațiile 1 și 2 conțin obiecte care au o durată de viață mai lungă. GC pentru generațiile 1 și 2 nu se va întâmpla până când generațiile 0 nu au suficientă memorie pentru a aloca.

Nu ar trebui să invocați GC programat. Este bine să-l lăsăm să se întâmple singur. GC primește apel ori de câte ori generația 0 se umple.

Pro și dezavantaje ale GC

Colectarea gunoiului este un instrument care economisește timp pentru programatori. De exemplu, înlocuiește nevoia de funcții precum malloc () și free () care se găsesc în C. Poate ajuta, de asemenea, la prevenirea scurgerilor de memorie.

Dezavantajul colectării gunoiului este că are un impact negativ asupra performanței. GC trebuie să ruleze în mod regulat prin program, verificând referințele obiectelor și curățând memoria. Aceasta necesită resurse și deseori necesită întreruperea programului.

Când să o faci

Dacă un obiect nu are referințe (nu mai este accesibil), atunci este eligibil pentru colectarea gunoiului.

De exemplu, în codul Java de mai jos, obiectul Thing la care se face referire inițial prin „lucru1” are o singură referință redirecționată către un alt obiect din heap. Acest lucru înseamnă că nu poate fi atins și va avea memoria nealocată de colectorul de gunoi.

class Useless {
  public static void main (String[] args) {
  Thing thing1 = new Thing();
  Thing thing2 = new Thing();
  thing2 = thing1; // direct thing2's reference towards thing1
                   // no references access thing2
} }

Un exemplu de colectare a gunoiului este ARC, prescurtare pentru contorizarea automată a referințelor. Aceasta este folosită de exemplu în Swift. ARC se rezumă la urmărirea referințelor la toate obiectele create. Dacă numărul de referințe scade la 0, obiectul va fi marcat pentru alocare.

Mai multe informatii: