optimizarea aplicații

Numirea unui colector de gunoi

La crearea unui colector de gunoi în .NET a urmărit două obiective principale:

a scăpa de bug-uri și capcanele asociate cu managementul memoriei manuală;

asigură efectuarea operațiunilor de gestionare a memoriei, egală sau mai mare decât performanța aranjamentelor manuale.

În curent limbaje de programare și cadre folosesc diferite strategii de management al memoriei. Vom examina pe scurt două dintre ele pe baza managementului blocului liber listă (a căror punere în aplicare pot fi găsite în colecția de instrumente de gestionare a memoriei standard de limbaj C) și colectarea gunoiului pe baza de numărare de referință.

Gestionarea listei libere

Managementul bazat pe lista de blocuri libere - un mecanism de memorie de management de alocare în biblioteca standard C, care este, de asemenea, managementul memoriei implicit în C ++, cum ar fi noi și șterge. Acest controler de memorie determinist, cu ajutorul căreia întreaga responsabilitate pentru alocarea și eliberarea memoriei cade pe umerii dezvoltatorului. blocuri de memorie liberă sunt stocate într-o listă legată, în cazul în care amintirile sunt luate în alocarea, și la care se întorc atunci când este eliberat.

optimizarea aplicații

Se elimină din lista de blocuri atunci când alocă memorie și le returnează înapoi la eliberare. O aplicație primește de obicei blocuri de memorie care dețin dimensiunile lor în zona de servicii.

Bazate pe lista de mecanism de gestionare a memoriei nu este liber a deciziilor tactice și strategice care afectează performanța aplicației. Iată câteva dintre ele:

O aplicație care utilizează un mecanism de gestionare a memoriei bazat pe lista de blocuri libere, primește inițial o piscină mică de blocuri libere, organizate sub forma unei liste. Lista poate fi sortate în funcție de dimensiune, timpul de utilizare și așa mai departe.

În cazul în care managerul cerere primește o cerere de alocare de memorie, se efectuează căutarea pentru blocul de memorie corespunzător. Conformitatea poate fi determinată pe un „primul-fit“, „mai potrivite“ sau folosind criterii mai complexe.

După epuizarea managerul lista interoghează sistemul de operare mai multe blocuri libere și le adaugă la lista. Când aplicația returnează memoria controlerului, acesta adaugă blocul vacant în listă. În această etapă poate fi realizată fuzionează blocuri adiacente libere, defragmentarea, și reducerea listei, și așa mai departe.

Mai jos sunt principalele probleme asociate cu managementul memoriei pe baza listei de blocuri libere:

Costul ridicat al operațiunilor de alocare: blocul de căutare corespunzătoare parametrilor de cerere, are nevoie de timp, chiar și atunci când se utilizează criteriul „prima potrivire“. În plus, blocurile sunt adesea împărțite în mai multe părți. În sistemele multiprocesor apare în mod inevitabil, o concurență pentru lista și necesitatea de a sincroniza operațiuni, cu excepția cazului în care utilizați mai multe liste. Pe de altă parte, prezența listelor multiple agravează fragmentarea lor.

Costul ridicat de eliberare: unitate de întoarcere în lista are nevoie de timp, și aici, din nou, există o problemă de sincronizare operațiuni deallocation concurente.

Valoarea de mare de control: Pentru a evita o situație de lipsă de blocuri de memorie dimensiuni adecvate, cu un număr mare de blocuri mici, trebuie să lista defragmenta. Dar această lucrare trebuie să fie efectuate într-un fir separat de execuție, care, la rândul său, necesită utilizarea de încuietori pentru a accesa lista și reduce rata operațiunilor de eliberare și de memorie liberă în sus. Fragmentarea poate fi redus prin alocarea de blocuri de dimensiuni fixe și menținerea mai multor liste, dar acest lucru crește numărul de operații dinamice de memorie pentru a menține o stare consistentă și adaugă costuri suplimentare pentru fiecare alocare de memorie și de presă de funcționare.

De colectare a gunoiului pe baza de numărare de referință

Gunoier, pe baza de numărare de referință, se asociază fiecare obiect cu un număr întreg variabil - număr de referință. Când creați o referință obiect numărului este inițializată 1. Atunci când o cerere creează o nouă referință la un obiect, numărul de referință este majorat cu 1. Atunci când cererea se elimină o trimitere la un obiect existent, numărul de referință este redusă cu 1 atunci când numărul de referință ajunge la 0, obiectul poate fi distrus și pentru a elibera toată memoria.

optimizarea aplicații

Un exemplu de control al memoriei pe baza numărului de referință în ecosistemul este Windows Component Object Model (Component Object Model, COM). COM obiecte sunt furnizate cu numărul de referință, determină durata existenței lor. În cazul în care numărul de referință merge la 0, obiectul poate elibera memoria sa. Greul de referință numărare suportate de către dezvoltator, sub forma unui apel explicit la AddRef () metode și eliberare (), deși în cele mai multe limbi sunt învelișurile automatiza apeluri aceste metode pentru crearea și ștergerea link-uri.

Mai jos sunt principalele probleme legate de gestionarea memoriei pe baza de numărare de referință:

Utilizarea memoriei: numărul de referință pe obiectul care urmează să fie stocate în memoria obiectului. Este câțiva octeți crește cantitatea de memorie ocupat de obiect, ceea ce face ca referință de numărare impracticabilă pentru obiecte ușoare. (Cu toate acestea, acest lucru nu este o mare problemă pentru CLR, unde se adaugă fiecare obiect „legat“ de la 8 la 16 octeți.)

optimizarea aplicații

În următorul articol ne vom uita la mecanismul de asamblare de moloz pe baza urmelor, care este utilizat în .NET.

articole similare