Bazele de colectare a gunoiului

Următoarea listă prezintă conceptele importante ale memoriei CLR.

Memoria virtuală poate fi în trei stări.

Gratuit. Nu există referințe la blocul de memorie și este disponibil pentru selectare.







Rezervat. Un bloc de memorie este disponibil pentru utilizare de către dezvoltator și nu poate fi utilizat pentru nicio altă cerere de alocare. Cu toate acestea, stocarea datelor în acest bloc de memorie nu este posibilă până când nu este alocată.

Evidențiat. Un bloc de memorie este atribuit unui magazin fizic.

După inițierea de către CLR, colectorul de gunoi alocă un segment de memorie pentru stocarea și gestionarea obiectelor. Această memorie este numită heap gestionat, spre deosebire de propria grămadă de sistem de operare.

Pentru fiecare proces gestionat este creat un heap de administrare. Toate firele din proces alocă memoria pentru obiecte din aceeași grămadă.

Pentru a rezerva colector de memorie de gunoi determină funcția Win32 VirtualAlloc alocă memorie pentru un segment la un moment dat pentru aplicații controlate. Colectorul de gunoi își rezervă, de asemenea, segmentele după cum este necesar, și returnează segmentele lansat ale sistemului de operare (pre-compensare-le de la toate obiectele) care cauzează funcția Win32 VirtualFree.

Dimensiunea segmentelor alocate de colectorul de gunoi depinde de implementare și poate fi modificată în orice moment, inclusiv actualizări periodice. Aplicația nu trebuie să facă presupuneri privind dimensiunea unui anumit segment, să se bazeze pe acesta sau să încerce să ajusteze cantitatea de memorie disponibilă pentru alocarea segmentului.

Cu cât mai puține obiecte sunt distribuite în halbă, cu atât mai puțin colectorul de gunoi va trebui să funcționeze. Atunci când plasați obiecte, nu utilizați valori rotunjite care depășesc cerințele reale, de exemplu, nu alocați 32 de octeți când sunt necesare doar 15 octeți.

Colecția de gunoi, atunci când rulează, eliberează memoria ocupată de obiectele neutilizate. procesul de eliberare a comprimă utilizate obiectele pe care le muta împreună, și elimină spațiul ocupat de obiecte neutilizate, reducându-se astfel gramada. Acest lucru asigură faptul că obiectele distribuite împreună vor rămâne în grămada gestionată lângă păstrarea localității.

Gradul de intervenție (frecvența și durata) colecțiilor de gunoi depinde de numărul de distribuții și de memoria stocată în heapul gestionat.

O grămadă poate fi considerată o colecție de două grămezi: o grămadă de obiecte mari și o grămadă de obiecte mici.

Mormântul obiectelor mari conține obiecte foarte mari, cu o dimensiune de 85.000 octeți. Obiectele din mormanul obiectelor mari sunt de obicei matrice. O instanță a unui obiect este rareori foarte mare.

Gropul este organizat sub formă de generații, care îi permite să proceseze obiecte de lungă durată și de viață scurtă. Colectarea gunoiului reduce practic distrugerea obiectelor de scurtă durată, care de obicei ocupă doar o mică parte din grămadă. În grămadă, există trei generații de obiecte.







Generație 0. Această generație cea mai tânără conține obiecte de scurtă durată. Un exemplu de obiect de scurtă durată este o variabilă temporară. Colectarea gunoiului este cel mai adesea efectuată în această generație.

Redistribută obiecte formează o nouă generație de site-uri și ansambluri sunt implicit generarea 0 în cazul în care nu sunt obiecte mari, în caz contrar acestea se încadrează într-o grămadă de obiecte mari în asamblare generație 2.

Cele mai multe obiecte sunt distruse atunci când gunoiul este colectat pentru generația 0 și nu supraviețui la următoarea generație.

Generație 1. Această generație conține obiecte de scurtă durată și servește ca un tampon între obiecte cu durată scurtă de viață și obiecte de lungă durată.

Generația 2. Această generație conține obiecte de lungă durată. Un exemplu de obiecte de lungă durată este un obiect în aplicația server care conține date statice care există pe durata procesului.

Colectarea deșeurilor se efectuează pentru generații specifice atunci când sunt îndeplinite condițiile relevante. Adunarea unei generații înseamnă colectarea de obiecte din această generație și din toate generațiile mai tinere corespunzătoare. Colecția de gunoi din generația 2 se mai numește colecție completă de gunoi, deoarece distruge toate obiectele din toate generațiile (adică toate obiectele din gropile gestionate).

Obiectele care nu sunt distruse atunci când se colectează gunoi se numesc obiecte supraviețuitoare și sunt transferate către generația următoare. Obiecte, de colectare a gunoiului a supraviețuit timp de generații 0, du-te la următorul, obiectele care au supraviețuit de colectare a gunoiului pentru generarea de 1 până la 2 generație trece, și obiectele care au supraviețuit de colectare a gunoiului pentru generarea de 2 rămân în generație 2.

În cazul în care colectorul de gunoi detectează o proporție mare de supraviețuire într-o generație, ridică distribuțiile pragul pentru această generație la următoarea colectare a gunoiului eliberat o parte vizibilă a memoriei. În CLR este monitorizată continuu echilibru două priorități: nu permit aplicației set de lucru pentru a deveni prea mare și nu permite colectarea gunoiului dura prea mult timp.

Deoarece obiectele din generațiile 0 și 1 sunt de scurtă durată, aceste generații sunt numite generații efemere.

Generațiile efemere trebuie distribuite într-un segment de memorie, numit un segment efemer. Fiecare segment nou este produs de colectorul de gunoi devine noul segment de efemere și conține obiecte care au supraviețuit colectarea gunoiului pentru generarea de 0. segment efemeră vechi devine o nouă generație de segment 2.

Dimensiunea segmentului efemeră depinde de faptul că sistemul este de 32 de biți sau 64 biți și de tipul colectorului de gunoi. Tabelul de mai jos prezintă valorile implicite.

Colectarea de gunoi constă în următoarele etape:

Faza de marcare, care caută toate obiectele folosite și face o listă a acestora.

O fază de mișcare care actualizează legături către obiecte comprimabile.

Faza de compresie, care eliberează spațiul ocupat de obiectele neutilizate și comprimă obiectele supraviețuitoare. La etapa de compresie, obiectele care au supraviețuit colectării gunoiului se mută la capătul mai vechi al segmentului.

Deoarece ansamblurile de generația 2 pot ocupa mai multe segmente, obiectele trecute în generația 2 pot fi mutate în segmentul mai vechi. Obiectele supraviețuitoare din generațiile 1 și 2 pot fi mutate într-un alt segment, deoarece au trecut în generația 2.

Pentru a determina dacă sunt folosite obiecte, colectorul de gunoi va folosi următoarele informații.

Rădăcinile stivei. Stive variabile furnizate de compilatorul JIT și ocolind stiva.

Descriptorii colectării gunoiului. Descriptorii care indică obiecte gestionate și care pot fi alocate cu un cod personalizat sau CLR.

Datele statice. Obiecte statice în domeniile de aplicație care pot să facă trimitere la alte obiecte. Fiecare domeniu de aplicație monitorizează obiectele sale statice.

Înainte de a utiliza colecția de gunoi, toate firele gestionate, cu excepția firului care lansează colecția de gunoi, sunt suspendate.

Următoarea figură prezintă un fir care lansează colecția de gunoi și provoacă întreruperea altor fire.

Bazele de colectare a gunoiului

Un fir care declanșează colectarea gunoiului







Articole similare

Trimiteți-le prietenilor: