Colectarea gunoiului

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

În informatică pentru colectarea gunoiului (termen uneori abreviat cu GC , literalmente colectare a deșeurilor ) se înțelege un mod de gestionare automată a memoriei , prin care un sistem de operare , sau un compilator și un modul de rulare, porțiuni libere de memorie inexistentă . prin aplicații . Cu alte cuvinte, colectorul de gunoi va nota zonele de memorie care nu mai sunt menționate , adică alocate de un proces activ și le va elibera automat. Colecția de gunoi a fost inventată în 1959 de John McCarthy pentru limbajul de programare Lisp [1] [2] .

Acest mecanism a provocat o schimbare notabilă în stilul de programare al limbajelor care îl implementează. De fapt, nu mai este necesar să solicitați în mod explicit eliberarea memoriei utilizate de un obiect sau să terminați acest obiect într-un mod determinist, dar lăsați sistemul să efectueze această operațiune automat, atunci când consideră că este mai potrivit pentru a îmbunătăți performanța generală. Această acțiune este definită în contextul finalizărilor nedeterministe .

Descriere

Pentru gestionarea memoriei sunt luate în considerare două principii fundamentale:

  1. Găsiți obiectele create anterior de un program la care nu veți mai avea nevoie să accesați;
  2. Obțineți resursele utilizate de aceste obiecte.

Prin efectuarea procesului de colectare a gunoiului , mediul în care rulează programul gestionează automat memoria, eliberând programatorul de necesitatea de a prezice când să elibereze resursele folosite de un obiect care nu mai este necesar pentru procesare . Acest mod automat îmbunătățește stabilitatea programelor, deoarece evită acea clasă de erori legate de utilizarea pointerelor către diferitele zone de memorie deja eliberate în trecut. [3]

Unele limbaje de programare , cum ar fi Java , Python și C # ( .NET ), au un sistem de colectare a gunoiului integrat direct în mediul de execuție, în timp ce pentru alte limbaje, cum ar fi C și C ++ , implementarea sa este responsabilitatea programator. Cu toate acestea, multe limbaje de programare folosesc o combinație a celor două abordări, cum ar fi Ada , Modula-3 și CLI , permițând utilizatorului să șteargă manual obiecte sau să accelereze procesul, chiar dezactivând gestionarea automată a sistemului GC . Colectarea gunoiului este aproape întotdeauna strâns integrată cu alocarea memoriei .

Beneficii

Colectarea gunoiului scuteste programatorul de alocarea manuală (cerere) și relocarea (eliberarea) zonelor de memorie, reducând sau eliminând complet unele categorii de bug-uri:

  • Indicatori agățători : persistență în program a indicilor care se referă la zone de memorie care conțineau obiecte, acum delocate. Utilizarea acestor zone de memorie delocate poate provoca, în cele mai bune cazuri, o eroare fatală a aplicației, dar pot apărea și alte probleme chiar și la ceva timp după delocarea reală. Rezolvarea acestor probleme poate fi foarte dificilă.
  • Dublă alocare : programul încearcă să elibereze din nou o zonă de memorie care a fost deja lansată.
  • Unele tipuri de scurgeri de memorie : programul pierde urmele unor zone de memorie alocate [4] , pierzând capacitatea de a le deloca atunci când nu mai sunt necesare. Acest tip de problemă se poate acumula pe parcursul executării programului, ducând, în timp, la epuizarea memoriei disponibile.

Majoritatea erorilor de programare în limbaje care nu prevăd colectarea gunoiului sau când este dezactivată voluntar, se încadrează în cazurile descrise mai sus.

Dezavantaje

Cu toate acestea, colectarea gunoiului are și unele dezavantaje:

  • Consumul de resurse de calcul : procesul consumă resurse de calcul, atât pentru a ține evidența utilizării diferitelor zone de memorie, cât și pentru a putea decide când și câtă memorie să elibereze;
  • Incertitudinea când se efectuează colectarea gunoiului : timpul în care se efectuează colectarea gunoiului nu este previzibil: această incertitudine poate duce la înghețuri bruște sau întârzieri în execuție. Probleme de acest fel sunt inacceptabile în medii în timp real , în detectarea driverelor periferice și în procesarea tranzacțiilor ;
  • Eliberarea memoriei nedeterministe : în mod similar, atât momentul în care este eliberată o anumită zonă de memorie, cât și ordinea de eliberare a diferitelor zone care nu mai sunt utilizate, depind de algoritmul particular implementat de colectorul de gunoi . Se poate spune că eliberarea memoriei are loc într-un mod nedeterminist.
  • Prezența scurgerilor de memorie : scurgeri de memorie , scurgeri de memorie sau scurgeri de memorie , pot apărea în continuare, în ciuda prezenței unui colector de gunoi. Acest lucru se poate întâmpla dacă programul menține o referință la obiecte care și-au epuizat ciclul de viață logic în aplicație. Prezența referințelor active face imposibil ca colectorul să detecteze zona de memorie ca neutilizată. [5] Acest lucru se poate întâmpla, de exemplu, cu colecțiile de obiecte. Monitorizarea ciclului de viață al obiectelor este o responsabilitate principală a dezvoltatorului în mediile colectate de gunoi .

Urmărirea colectării gunoiului

Cea mai comună metodă de colectare a gunoiului este metoda de urmărire . Această metodă constă în stabilirea mai întâi a obiectelor care pot fi accesate (sau potențial) și apoi înlăturarea tuturor celor care nu sunt.

Accesibilitatea unui obiect

Fie „ p ” și „ q ” două obiecte, iar q să fie un obiect accesibil. Vom spune că p este accesibil într-un mod recursiv, dacă și numai dacă există o referință la acesta prin obiectul q (adică p este accesibil printr-un obiect q, accesibil la rândul său). Un obiect poate fi accesat numai în două cazuri:

  • Când este creat la începutul programului (obiect global) sau una dintre sub-procedurile sale (obiecte de domeniu , create pe stivă ); obiectul în cauză se numește rădăcină în acest caz;
  • Când un alt obiect accesibil păstrează o referință la acesta; mai formal, accesibilitatea este o închidere tranzitivă .

Identificarea zonelor de memorie nedorită cu cele inaccesibile nu este optimă, deoarece s-ar putea întâmpla ca un program să utilizeze o anumită zonă pentru ultima dată cu mult înainte de a deveni inaccesibil. Uneori, se face o distincție între gunoiul sintactic , când obiectul nu poate fi atins de program și semantica , când programul nu mai dorește să utilizeze obiectul. De exemplu:

 Obiect x = nou Foo ();
Obiect y = new Bar ();
x = new Quux ();
/ * Din acest punct obiectul Foo, inițial
* atribuit lui x, nu mai poate fi referit:
* Foo este un obiect junk sintactic
* /

if ( x . check_something ())
{
    x . face_ceva ( y );
}
Sistem . ieșire ( 0 );
/ * În blocul condițional, y poate fi junk semantic, dar nu
* putem spune acest lucru până când x.check_something () se termină prin returnarea unui
* valoare; aceasta presupunând întotdeauna că se termină de fapt într-un timp finit
* /

Problema identificării precise a gunoiului semantic este, din păcate, doar parțial hotărâtă : din exemplul prezentat mai sus, de fapt, este clar că identificarea pozitivă a unui obiect ca gunoi semantic depinde de faptul că elaborările anterioare se termină corect într-un timp finit. . Acest lucru implică faptul că un colecționar care dorește să identifice gunoiul semantic ar trebui să poată decide, din nou într-un timp finit, dacă se încheie o anumită procedură ( oprirea problemei ). Prin urmare, în esență, toți colectorii implementați se concentrează pe junk sintactic.

Algoritm de bază

Colectoarele de urmărire sunt algoritmi dedicați, deoarece sunt capabili să urmărească setul de lucru al memoriei, efectuând ciclic colectarea obiectelor care nu mai sunt necesare. Un ciclu este pornit atunci când colectorul de gunoi determină că trebuie să recupereze memoria; acest lucru se întâmplă mai frecvent atunci când sistemul are memorie redusă. Metoda originală implică un mark-and-sweep [6] în care setul de memorie este scanat de mai multe ori.

Marcare și măturare naivă

În marcare și măturare, fiecare obiect din memorie are un steag , de obicei este suficient un bit , rezervat exclusiv pentru utilizarea colectorului de gunoi. Când obiectul este creat, steagul este plasat în stare, steagul este șters [7] . În timpul primei faze sau a fazei Mark a ciclului de colectare a gunoiului, se scanează întregul set de rădăcini , plasând fiecare obiect într-o stare de pavilion. [8] Toate obiectele accesibile din rădăcina setului sunt, de asemenea, marcate ca set de steaguri . [8] În a doua fază, sau faza Sweep , fiecare obiect din memorie este examinat din nou; cei care încă mai au semnalul clar [7] nu sunt accesibili de niciun program sau date și, prin urmare, memoria lor este eliberată. Pentru obiectele marcate cu steagul setat, steagul este setat să steargă [7] , pregătindu-le pentru următorul ciclu de colectare a gunoiului.

Această metodă are mai multe dezavantaje, de exemplu, întregul sistem este suspendat în timpul colectării gunoiului într-un mod care nu este întotdeauna previzibil și pentru perioade de timp care nu pot fi determinate în prealabil; acest tip de comportament poate crea probleme semnificative în medii care necesită latențe de răspuns scăzute sau în sisteme în timp real sau cu misiune critică, cu eventuale defecțiuni, blocaje și opriri care pot compromite întregul sistem. În plus, toată memoria de lucru trebuie examinată, cel puțin de două ori, putând provoca probleme în sistemele de memorie paginate .

Marcare în trei culori

Datorită acestor dezavantaje, cei mai moderni algoritmi de colectare a gunoiului implementează variații în ceea ce privește mecanismele simple, cum ar fi marcarea și măturarea , prin aplicarea algoritmilor de tip tri-culoare . Algoritmul efectuează marcaje pe trei niveluri diferite în conformitate cu următoarele faze:

  1. Creați seturi de niveluri de alb, gri și negru utilizate pentru a urmări diferitele progrese realizate în timpul ciclului.
    • Setul alb este setul de obiecte care sunt candidate la reciclare.
    • Setul negru este setul de obiecte fără referințe de ieșire la obiecte din setul alb, accesibil din rădăcină. Articolele din setul negru nu sunt candidate la reciclare; în multe implementări, setul negru începe ca gol.
    • Setul gri conține toate obiectele accesibile din rădăcină, dar care trebuie încă scanate pentru a verifica dacă au referințe externe la obiecte „albe”. Din moment ce se știe că sunt accesibile la rădăcină, nu pot fi reciclate și vor ajunge în setul negru după ce au fost scanate. Setul gri este inițializat cu obiecte direct referite de rădăcină; de obicei toate celelalte obiecte sunt plasate inițial în setul de alb.
    • Obiectele pot trece doar de la alb la gri și de la gri la negru, dar nu invers.
  2. Colectați obiecte din setul gri și mutați-le în setul negru dacă nu pot fi colectate gunoi.
  3. Repetați pașii diferiți până când setul de gri devine gol.
  4. Când nu mai există obiecte în setul gri , toate obiectele rămase în setul alb s-au dovedit a fi inaccesibile, astfel încât spațiul de memorie pe care îl ocupă este recuperat.

Deoarece toate obiectele care nu pot fi accesate imediat din rădăcină sunt de obicei atribuite setului de alb, iar obiectele se pot deplasa doar de la alb la gri și de la gri la negru, algoritmul păstrează un invariant important - niciun obiect negru nu indică direct un obiect alb . Acest lucru asigură că obiectele albe pot fi distruse în siguranță odată ce setul de gri este gol.

Algoritmul are un avantaj important: poate fi rulat din mers, fără ca sistemul să fie oprit pentru perioade semnificative de timp. Acest lucru se realizează prin marcarea obiectelor pe măsură ce sunt alocate și în timpul modificărilor, păstrând cele trei seturi. Prin monitorizarea dimensiunii colecțiilor, sistemul poate efectua colectarea gunoiului periodic sau după cum este necesar. În plus, este eliminată necesitatea de a atinge întregul set de obiecte în timpul fiecărui ciclu de gunoi colectat.

Strategia de implementare

Pentru a implementa algoritmul de marcare tri-culoare , se iau decizii importante în momentul proiectării și acest lucru poate afecta semnificativ caracteristicile de performanță ale colectorului de gunoi.

Mișcare versus non-mișcare

Odată ce setul a fost clasificat ca fiind inaccesibil, colectorul de gunoi poate pur și simplu să arunce obiectele care nu pot fi accesate sau să copieze unele sau toate obiectele accesibile într-o zonă de memorie nouă, actualizând toate referințele la acele obiecte după cum este necesar. Acestea sunt numite respectiv colector în non-mișcare și mișcare.

La prima vedere, o strategie de colectare a gunoiului în mișcare poate părea ineficientă și costisitoare în comparație cu abordarea fără mișcare , deoarece pare să necesite mult mai mult timp de procesare pe ciclu. În realitate, strategia din mers duce la mai multe beneficii în termeni de performanță, atât în ​​timpul ciclului de colectare a deșeurilor, cât și în timpul executării programului propriu-zis:

  • Nu este nevoie de timp suplimentar pentru a recupera spațiul eliberat de obiecte care nu pot fi atinse, întreaga regiune fiind astfel considerată liberă. În schimb, un colector de gunoi care nu se deplasează trebuie să verifice fiecare obiect inaccesibil și să înregistreze că memoria ocupată de acestea este disponibilă.
  • Deoarece regiunile mari adiacente de memorie sunt puse la dispoziție în general prin strategia de colectare a gunoiului în mișcare , obiectele noi pot fi atribuite pur și simplu prin incrementarea unei locații de memorie. O strategie fără mișcare, pe de altă parte, poate duce, după un timp, la o structură de date foarte fragmentată ( heap ), o structură care necesită o consultare mai frecventă a micilor blocuri de memorie disponibile, pentru a aloca aceste noi obiecte.
  • Obiectele care se referă reciproc pot fi adesea mutate în locații de memorie adiacente, crescând probabilitatea ca acestea să se afle pe aceeași linie cu memoria cache sau pagina de memorie virtuală . Acest lucru va accelera foarte mult accesul la obiecte noi prin referințe.

Un dezavantaj al colectării gunoiului în mișcare este că permite accesul numai prin referințe gestionate de referințe de deșeuri, prevenind aritmetica indicatorului . Acest lucru se întâmplă deoarece indicatorii inițiali nu mai sunt valabili din momentul în care colectorul de gunoi mută obiectul, vor deveni indicatori suspendați. Pentru interoperabilitate cu codul nativ , colectorul de gunoi trebuie să copieze locația conținutului obiectului în afara regiunii de memorie care conține deșeurile. O abordare alternativă este salvarea obiectului în memorie cu un cod PIN, împiedicând colectorul de gunoi să se miște, permițând pointerilor nativi să lucreze direct cu memoria și permițând eventual aritmetica indicatorului. [9]

Copia de marcare și mătură față de copia de marcare și de măturare

După cum am văzut deja, pentru a rafina în continuare distincția, colecționarii pot urmări obiectele în conformitate cu trei seturi (alb, gri și negru) și le pot păstra pe tot parcursul ciclului de colectare. Abordarea mai simplă a fost inventată în 1969 și se numește colector semi-spațial. În această schemă de colectare a gunoiului în mișcare, memoria este împărțită în două părți: „de la spațiu” și „la spațiu” . Obiectele sunt atribuite inițial „spațiului” până când devin obiecte cu drepturi depline și colecția este activată. La început starea „în spațiu” devine „din spațiu” și invers, iar obiectele accesibile din rădăcină sunt copiate din spațiu în spațiu. Aceste obiecte sunt scanate la rândul lor și orice obiecte la care indică sunt copiate în spațiu până când toate obiectele accesibile pot fi copiate în această parte. Această abordare are avantajul de a fi simplă din punct de vedere conceptual (cele trei seturi sunt construite în timpul procesului de copiere), dar un dezavantaj este că este necesară o mare regiune contiguă de memorie liberă la fiecare ciclu de colectare. Tehnica este, de asemenea, cunoscută sub numele de stop-and-copy. O îmbunătățire suplimentară față de colectorul semi-spațial este algoritmul Cheney . [10]

O colecție de gunoi marcată și măturată, conține unul sau doi biți pentru fiecare obiect care trebuie înregistrat. Arborele de referință este parcurs în timpul unui ciclu de colectare (faza de marcare) și obiectele sunt manipulate de colector pentru a reflecta starea curentă, iar faza de măturare eliberează memoria. Mark-and-sweep are avantajul că, odată ce setul inaccesibil a fost determinat, nici o strategie de mutare și nici o strategie de non-mutare nu pot fi implementate.

O colecție de gunoi marca-și-nu-mătură ca cea precedentă, păstrează un pic pentru ca fiecare obiect să fie înregistrat, dar există două diferențe fundamentale: în primul rând, setul alb-negru are o semnificație diferită de cea a marcarea și măturarea, deoarece în ultimul sistem toate obiectele accesibile sunt întotdeauna negre. Un obiect marcat cu negru va rămâne negru chiar dacă devine de neatins. Un obiect alb este atribuit ca inutilizabil. În al doilea rând, interpretarea alb-negru poate varia (0 = alb, 1 = negru) și invers.

Generational Garbage Collector (Colector de gunoi efemer)

S-a observat că în multe programe cele mai recente obiecte sunt, de asemenea, cele mai susceptibile de a deveni rapid inaccesibile [11] . Ipoteza generațională împarte obiectele în generații. În plus, sistemul de runtime menține cunoștințele despre toate referințele, urmărind de la crearea lor, până la suprascrierea referințelor. Când colectorul de gunoi funcționează, este posibil să poată utiliza aceste cunoștințe pentru a demonstra că unele obiecte inițial din setul de pornire gol nu sunt accesibile fără a fi nevoie să traverseze întreaga structură de referință. Pentru a implementa acest concept, mulți colecționari de deșeuri generaționale folosesc zone de memorie separate pentru diferite niveluri de obiecte. Când o regiune este plină, cele câteva obiecte la care se face referire în memoria veche sunt promovate (copiate) în regiunea imediat următoare, astfel încât întreaga regiune să poată fi suprascrisă cu obiecte noi. Această tehnică vă permite să măriți viteza, deoarece colectarea deșeurilor dintr-o singură regiune are loc în același timp.

Colecția generațională de gunoi este o abordare euristică și unele obiecte inaccesibile nu pot fi recuperate în fiecare ciclu. Prin urmare, poate fi uneori necesar să revendicați tot spațiul disponibil. De fapt, sistemele de rulare pentru limbaje de programare moderne (cum ar fi java ) folosesc de obicei unele variații ale diferitelor strategii care au fost descrise până acum.

Stop-the-world versus incremental versus concurrent

Mecanismul stop-the-world funcționează prin simpla întrerupere a executării ciclului de colectare pentru a se asigura că obiectele noi nu sunt atribuite și nu devin brusc inaccesibile în timp ce colectorul rulează. Dezavantajul evident este că programul nu poate face nicio lucrare utilă în timp ce ciclul de colectare (numit „pauză jenantă”) rulează. Colectarea incrementală și concurentă a gunoiului este concepută pentru a reduce această întrerupere prin efectuarea ciclului de colectare a deșeurilor în faze separate de execuția programului. Ideea de proiectare este să vă asigurați că programul nu interferează cu colectorul de gunoi și invers.

Precis împotriva indicatoarelor conservatoare și interne

Unii colecționari care efectuează în anumite medii pot identifica corect toate indicatoarele (referințele) unui obiect care sunt, prin urmare, numite „precise”, contrar colecționarilor conservatori. Acestea din urmă presupun că orice secvență de biți din memorie ar putea fi un indicator care indică orice obiect alocat. Un exemplu în care este nevoie de un colector de gunoi conservator este limbajul de programare C care alocă pointeri (nu nul) aplică un tip cast ( nul ) și invers.

O problemă conexă este aceea a indicilor interni sau a indicațiilor către câmpurile dintr-un obiect. Dacă semantica unui limbaj permite indicatori interni și, prin urmare, pot exista multe adrese care se referă la același obiect, este dificil să se determine când un obiect este respins sau nu. Un exemplu este C ++ , unde moștenirea multiplă poate provoca indicatori care se referă la obiecte de bază cu adrese diferite. Chiar și în limbaje precum Java , cu toate acestea, indicatorii interni pot întâmpina probleme în timpul calculului, de exemplu atunci când se referă la o matrice, iar într-un program bine optimizat, pointerul corespunzător obiectului în sine ar fi putut fi suprascris în registrul său, astfel indicatorii interni trebuie să fie scanați.

Implicații

Urmărirea colecțiilor de gunoi necesită uneori implicit costuri generale și uneori dincolo de controlul programatorului, ducând la probleme de performanță. De exemplu, oprirea colecțiilor de gunoi în timpul executării programului face pauze în mod arbitrar, colectarea gunoiului, care este inadecvată pentru unele sisteme încorporate de înaltă performanță, servere și alte aplicații cu cerințe de sistem în timp real . Principalele diferențe dintre alocările manuale și automate sunt:

Alocare manuală a heap-ului :

Alocarea colectării gunoiului

  • Găsiți obiecte accesibile
  • Copiați obiectele care au fost mutate
  • Citirea / scrierea barierelor
  • Căutați cel mai bun / primul bloc

Este dificil să se determine care dintre cele două cazuri este mai bun, deoarece comportamentul lor depinde de situație. Unele progrese în colectorul de gunoi pot fi înțelese ca o reacție mai bună la problemele de performanță. Primii au fost colectorii de gunoi din lume , dar performanța lor a fost deviată în aplicații interactive. Tehnicile de colecție generațională sunt utilizate atât cu colecția stop-the-world, cât și cu colecția incrementală pentru a crește performanța.

Determinismul

Urmărirea colectării gunoiului nu este deterministă. Un obiect care devine eligibil pentru colectorul de gunoi va fi în general eliminat în cele din urmă, dar nu există nicio garanție când și dacă se va întâmpla acest lucru. Acest lucru poate duce la probleme:

  • Majoritatea mediilor cu analiză a colectorului de gunoi necesită repartizare manuală pentru resurse de memorie nelimitate, care rulează la momente nepotrivite.
  • Impactul performanței cauzat de colectorul de gunoi este aparent aleatoriu și dificil de prezis.

Numărarea referințelor

Numărarea referințelor sau numărarea referințelor este o formă de gestionare automată a memoriei, în care fiecare obiect are un număr al numărului de referințe la acesta. Contorul este incrementat atunci când este creată o referință la obiect și scade atunci când o referință este distrusă. Memoria obiectului este recuperată atunci când numărătoarea ajunge la zero.

Există două dezavantaje majore în contorizarea referințelor:

  • Dacă două sau mai multe obiecte se referă reciproc, pot crea o buclă în care nu sunt eliberate niciodată și referința lor este evaluată ca zero. Unele sisteme de colectare a gunoiului, cum ar fi cel din CPython, utilizează un număr de referințe specific pentru a rezolva această problemă. [12]
  • În implementări mai simple, orice atribuire de referință și orice referință pierdută necesită adesea modificări ale unuia sau mai multor contoare de referință. Atunci când sunt utilizate într-un mediu cu mai multe fire , aceste modificări de creștere / descreștere pot fi interconectate, dar acest lucru este costisitor pentru procesele fără operații atomice, cum ar fi Comparare și swap. Un avantaj important al contorului de referință este că oferă un colector de gunoi determinist.

Analiza evadării

Analiza de evacuare poate fi utilizată pentru a muta locațiile de memorie din heap în stiva sau registrele CPU, reducând astfel cantitatea de muncă care trebuie făcută de colectorul de gunoi. Mișcarea este permisă atunci când referința la obiect nu supraviețuiește subrutinei în care a fost declarat, adică atunci când referința este, din toate punctele de vedere, o variabilă locală, care nu este transmisă la alte subrutine sau returnată în amonte.

Exemplu (Java)

 clasa A {
  final int finalValue ;

  public A ( B b ) {
    super ();
    b . faceCeva ( asta ); // asta scapă!
    Valoare finală = 23 ;
  }

  int getTheValue () {
    returnează Valoarea finală ;
  }
}

clasa B {
  void doSomething ( A a ) {
    Sistem . afară . println ( a . getTheValue () );
  }
}

În acest exemplu, constructorul clasei A trece noua instanță A la B.doSomething , astfel încât compilatorul nu poate garanta că indicatorul nu supraviețuiește constructorului: indicatorul „scapă” scapă.

Disponibilitate

În general, limbajele de programare la nivel înalt au de obicei un colector de gunoi ca o caracteristică standard. În limbile care nu o fac, acest lucru este adesea adăugat printr-o bibliotecă, cum ar fi cu colecția de deșeuri Boehm de C și C ++ . Majoritatea limbajelor de programare funcționale, cum ar fi ML , Haskell și APL, au ca element implicit Garbage Collector. Lisp a fost primul limbaj funcțional care a introdus acest mecanism.

Alte limbaje dinamice, cum ar fi Ruby, tind să folosească colectorul de gunoi. Limbajele de programare orientate obiect , precum Smalltalk , Java și ECMAScript , au de obicei un colector de gunoi încorporat. Din punct de vedere istoric, limbajele pentru începători, cum ar fi BASIC, folosesc adesea variabile de diferite lungimi, precum șiruri și liste, pentru a scuti programatorul de sarcina de a gestiona manual memoria. Problema legată de viteza sistemului încetinită de acțiunea colectorului de gunoi crește semnificativ la microcomputere.

Medii limitate

Garbage Collector este rar utilizat în medii încorporate sau în timp real din cauza nevoilor unor astfel de medii. Cu toate acestea, colectoarele de gunoi compatibile au fost dezvoltate pentru aceste medii limitate [13] . Microsoft .NET Micro Framework și Java Platform, Micro Edition sunt platforme software încorporate care prezintă colectarea gunoiului.

Notă

  1. ^ (EN)Funcții recursive ale expresiilor simbolice și calculul acestora de către mașină , pe portal.acm.org. Adus 29-03-2009 .
  2. ^ (EN) Funcții recursive ale expresiilor simbolice și calculul lor prin mașină, Partea I , pe www-formal.stanford.edu. Adus pe 29 mai 2009 (arhivat din original la 4 octombrie 2013) .
  3. ^ Numită tehnic problema „ indicatoarelor atârnătoare ”.
  4. ^ De exemplu, în cazul în care indicatorul către ele este modificat.
  5. ^ Maebe Jonas, Ronsse Michiel, De Bosschere Koen, Detecția precisă a scurgerilor de memorie ( PDF ). Adus la 13 mai 2010 .
  6. ^ Trad.Ing.: " Faceți și aruncați "
  7. ^ a b c Trad.Ing.: " Nu se utilizează "
  8. ^ a b Trad.Ing.: " În uz "
  9. ^ Copiere și fixare , pe msdn.microsoft.com , Microsoft. Adus la 20 decembrie 2015 ( arhivat la 26 august 2013) .
  10. ^ Algoritmul lui Chaney ( PDF ), pe pages.di.unipi.it .
  11. ^ Efect cunoscut sub numele de Colecție de gunoi efemer sau generațional.
  12. ^ Reference Counts , on Extending and Embedding the Python Interpreter , 21 februarie 2008. Accesat la 13 noiembrie 2008 (arhivat din original la 23 octombrie 2008) .
    „În timp ce Python folosește implementarea tradițională de numărare a referințelor, oferă și un detector de cicluri care funcționează pentru a detecta ciclurile de referință.” .
  13. ^ Wei Fu și Carl Hauser, „Un cadru de colectare a gunoiului în timp real pentru sisteme încorporate”. ACM SCOPES '05, 2005.

Elemente conexe

Controllo di autorità GND ( DE ) 4269286-6
Informatica Portale Informatica : accedi alle voci di Wikipedia che trattano di informatica