terminologie
Din punct de vedere al limbii române mai corect au fost numite metoda nu „asambla“ și „de colectare a gunoiului“. [1] Cu toate acestea, este stabilit cuvântul „adunare“, în limba română.
Colectorul de gunoi în comun limbajul sunt uneori numite „colector de gunoi“.
De colectare a gunoiului a fost folosit pentru prima dată în 1959 Dzhonom Makkarti mediu de programare dezvoltat pe lor limbaj funcțional de programare Lisp. Mai târziu a fost folosit în alte, în principal, sisteme și limbaje de programare - în funcționale și logice. Nevoia de colectare a gunoiului în limbile acestor tipuri, datorită faptului că structura acestor limbi face foarte inconfortabil de urmărire durata de viață a obiectelor în memorie și gestionarea manuală a acesteia. Utilizat pe scară largă în aceste limbi și liste bazate pe aceste structuri de date complexe, în timp ce programele sunt în mod constant create, sunt construite, extinse, copiate, și de a determina corect momentul scoaterii unui obiect dificil.
În limbile de procedură și obiecte industriale, de colectare a gunoiului nu a fost folosit pentru o lungă perioadă de timp. Sa acordat prioritate de management al memoriei manual este mai eficient și previzibil. Dar a doua jumătate a anilor 1980, tehnologia de colectare a gunoiului a fost utilizată în procesul de luare a deciziilor, precum și în limbaje de programare bazate pe obiect. Acesta este utilizat în prezent în mai multe limbi, în special în Oberon. Python, C #, D, și alte limbi.
probleme de memorie manuale
Metoda tradițională de gestionare a memoriei limba politică este manual. Esența ei în următoarele:
- Pentru a crea un obiect pe programator heap solicită în mod explicit comanda de alocare de memorie. Această comandă returnează un pointer la zona de memorie alocată, care este stocat și utilizat pentru a accesa.
- Atâta timp cât este necesar pentru programul de obiectul creat, programul îl accesează printr-un pointer salvat anterior.
- Atunci când nici un obiect trece, programatorul face apel în mod explicit comanda deallocation, care trece un pointer la un obiect șters.
În orice limbă, permite crearea de obiecte pe heap, eventual două probleme posibile: (. Scurgere de memorie în engleză) link-uri Suspendate (. Engleză) Și bălăbăneală macazelor pierderi de memorie.
agățare
Aspectul de link-uri suspendate este de obicei consecința unei evaluări incorecte duratei de viață a obiectului: programator invocă comanda pentru a șterge un obiect înainte de utilizarea acestuia este oprit.
scurgere de memorie
Mecanismul de colectare a gunoiului
principii de bază
De colectare a gunoiului - o tehnologie care permite, pe de o parte, pentru a simplifica programarea, salvarea programator de la a trebui să ștergeți manual obiectele create pe heap, pe de altă parte - pentru a elimina cauzate de memorie necorespunzătoare de eroare manuală.
Sistemul de memorie liberă taxe de colectare a gunoiului de obiecte care nu mai sunt utilizate, este atribuit mediului de execuție a programului. Programatorul creează un obiect dinamic și le utilizează, el nu poate avea grijă de îndepărtarea obiectului, așa cum o face pentru el miercuri. Pentru punerea în aplicare a colectării gunoiului în mediul de execuție include un modul software special numit „colector de gunoi.“ Acest modul se execută periodic, determină care nu mai creat în timpul utilizării, și eliberează memoria ocupată de ei în obiecte heap.
GC frecvența de start este determinată de caracteristici ale sistemului. Colector poate rula în fundal, pornind de la un program atunci când inactiv (de exemplu, atunci când programul este inactiv, de așteptare pentru intrare de utilizator). Colectorul de gunoi ruleaza întrerupe definitiv executarea programului, atunci când operațiunea următoare este o alocare de memorie nu poate fi făcută datorită faptului că toată memoria disponibilă este epuizată.
Deși, în general, este imposibil să se determine cu exactitate când obiectul a fost utilizat pentru ultima dată și nu mai este nevoie, colectorii de gunoi folosesc estimări conservatoare pentru determinarea că obiectul în viitor este garantat să nu fie utilizat.
obiecte de atins
În mod normal, criteriul că obiectul este încă în uz, este de a avea legături cu ea. Dacă nu există mai multe referiri la obiect, în mod evident, acesta nu poate fi folosit de program, și, prin urmare, pot fi șterse. Acest criteriu este folosit de cele mai multe colectoare moderne gunoi numite obiecte mai accesibile.
Informal, puteți specifica următoarea definiție recursiv obiect realizabil:
O astfel de definiție nu este, teoretic, precum și în numărul de realizabile, în conformitate cu el, există, de asemenea, obiecte care nu vor fi utilizate, dar care încă există link-uri. Optimul ar fi considerat un obiect imposibil de atins, care, în cursul programului suplimentar de lucru nu va fi un singur tratament, dar identificarea unor astfel de site-uri nu este posibil, deoarece a redus la problema indecidabila pentru a opri (este suficient să presupunem că un obiect X va fi utilizat dacă și numai în acest caz, în cazul în care programul este de succes P).
Un algoritm simplu pentru determinarea obiectelor accesibil „, marchează algoritmul» (Marcu și Sweep), este după cum urmează:
O altă variantă a algoritmului pentru determinarea accesibilități - de obicei numărare de referință. Utilizarea sa retardati operațiunile de atribuire de link-uri, dar definiția obiectelor accesibil este banal - toate obiectele, valoarea de referință conta mai mare decât zero. Fără elaborare suplimentară, acest algoritm, spre deosebire de cel anterior, nu se elimina lanțurile ciclic închise de obiecte învechite, păstrează o trimitere la unul pe altul.
Strategia de colectare a gunoiului
Odată ce se determină setul de obiecte de neatins, colectorul de gunoi poate recupera memoria ocupată de ei, și se lasă restul așa cum este. Puteți posta, de asemenea, de memorie liber pentru a muta toate sau o parte din restul obiectelor din alte zone de memorie, actualizarea în același timp, toate referirile la ele. Aceste două exemple de realizare sunt denumite, respectiv, și pentru a muta nedeplasabili.
Ambele strategii au atât avantaje cât și dezavantaje:
Rata de alocare și deallocation- gunoier nedeplasabili eliberează rapid memoria (deoarece această operație conduce la blocurile de memorie respective de etichetare ambele gratuite), dar își petrece mai mult timp cu privire la selectarea ei (deoarece memoria este segmentat și alocarea trebuie să se găsească în cantitatea de card de memorie dorită a unei blocuri de dimensiuni adecvate).
- Mutarea colector necesită relativ mai mult timp pe scena de colectare a gunoiului (petrecut timp suplimentar pe defragmentare de memorie și schimba toate referințele la obiectele plutitoare), dar mișcarea permite extrem de simplu și rapid (Despre (1)), algoritmul de alocare a memoriei. Atunci când obiectele sunt mutate de defragmentare, astfel încât să se separe toată memoria în două zone mari - ocupate și neocupate, și stochează un pointer la granița lor. Pentru a evidenția noua memorie trebuie să se deplaseze numai frontiera, revenind piesa de la începutul de memorie liberă.
instalațiile de generare
După cum arată practica, nou create obiecte din ce în ce nu pot fi atinse decât obiectele existente pentru o lungă perioadă de timp. Conform acestei legi, mulți colecționari moderne de gunoi sunt împărțite toate obiectele pentru câteva generații - o serie de obiecte cu o durată de viață de aproape. De îndată ce memoria alocată uneia dintre generații, se termină în această generație și în toate obiectele imposibil de găsit mai „tânăr“ este căutat. Toate acestea sunt eliminate, iar restul transferat la generația „mai în vârstă“.
Folosind generațiile reduce ciclul de colectare a gunoiului, reducerea numărului văzut în ansamblul de obiecte, dar această metodă necesită link-urile de urmărire a rulării între generații.
Cerințe de limbă și sistem
Deci, programul poate folosi de colectare a gunoiului, este necesar să se îndeplinească o serie de condiții referitoare la runtime limbă și cele mai multe sarcini.
utilizați probleme
Contrar afirmațiilor frecvente, existența gunoier nu scutește programator de la toate problemele de gestionare a memoriei.
Avantaje și dezavantaje
Comparativ cu managementul memoriei manual, de colectare a gunoiului mai sigur, deoarece previne apariția unor pierderi de memorie și link-uri suspendate din cauza îndepărtării prematură a obiectelor. Un alt lucru pozitiv - simplificarea procesului de programare. După cum sa menționat mai sus, programatorul nu poate ignora complet problema de gestionare a memoriei, în prezența unui colector de gunoi, dar costul de gestionare a memoriei, în acest caz, este încă semnificativ mai mic.
Cu toate acestea, în multe cazuri, cu sisteme de colectare a gunoiului prezintă eficiență mai mică, atât în viteză și în utilizarea memoriei (care este inevitabilă, deoarece colectorul de gunoi consumă resurse și necesită unele exces de memorie liberă pentru funcționarea normală).
de gestionare a memoriei în limbi și sisteme specifice
De colectare a gunoiului este adesea în contrast cu managementul memoriei manuală, în care programatorul specifică în mod explicit, atunci când și ce zone de memorie ar trebui să fie eliberat. Cu toate acestea, există limbi în care folosește o combinație a celor două tehnici de gestionare a memoriei, precum și mai există și alte tehnologii pentru a rezolva aceeași problemă fundamentală (de exemplu, EN: regiune inferență).
Unele limbaje de programare necesită utilizarea mecanismului de colectare a gunoiului, în conformitate cu specificația sa (C #), celălalt - din motive de eficiență a punerii în aplicare (de exemplu, limbaje formale pentru calculul lambda) - Aceste limbi sunt numite limbi străine cu colectarea gunoiului. Multe limbi străine cu colectarea gunoiului nu au oportunități pentru îndepărtarea manuală explicită a obiectelor (de exemplu, operatorul șterge), astfel încât apariția atârnând referințe excluse, în principiu, iar colectorul de gunoi se ocupă doar cu eliminarea de obiecte care nu sunt referite din program.
Unele limbi (de exemplu, Modula-3) puteți utiliza gestionarea memoriei ca manuală și colectarea gunoiului într-o singură aplicație - folosind două grămezi separate.