Prügikoguja (GC) on mäluhaldur. Paljudel programmeerimiskeeltel on sisseehitatud GC. See funktsioon eraldab ja eraldab programmi mälu automaatselt. See vabastab seotud, kasutamata mälu, mis aeglustab teie rakendust.

GC ilu seisneb selles, et see vabastab mälu teie nimel, ilma et peaksite midagi tegema. Seetõttu võite seda pidada nii oluliseks funktsiooniks, et eeldate, et see on igal programmeerimiskeelel. Kahjuks see nii ei ole; isegi populaarsel keelel nagu C võib puududa GC.

Kuidas mälu eraldamine toimib?

Kui käivitate programmi mis tahes programmeerimiskeeles, jätab teie operatsioonisüsteem a andmevirn mällu selle programmi jaoks. See programm omab ja kasutab seda andmevirnu kuni täitmise lõpuni. Kui teie programm vajab rohkem mälu, kui on saadaval, võib see dünaamiliselt eraldada operatsioonisüsteemi mäluhunnikust rohkem mälu.

Programmeerimisel tähistab muutuja mälukohta. Seega, kui deklareerite uue muutuja, eraldab programmeerimiskeel selle muutuja jaoks mäluruumi. Muutujal on nüüd mäluaadress. Kuni sellele muutujale väärtuse määramiseni jääb see initsialiseerimata ja võib sisaldada prügiväärtust.

Kui programmeerimiskeel võimaldab deklareerida muutujat ilma seda initsialiseerimata, siis on see dünaamiline muutuja. See tähendab, et muutujale määratud väärtus võib aja jooksul muutuda. Muutuja mälukoht jääb aga samaks, kuni te selle lahti eraldate.

Kuidas mälu eraldamine töötab?

Mälu eraldamine on sarnane protsess kõigi programmeerimiskeelte jaoks. Kuid vastav mälu eraldamise meetod kipub erinema. Mälu eraldamise meetodeid on kahte tüüpi; manuaal ja automaat. GC teeb automaatset jaotamist.

Mälu eraldamine ilma prügikogujata

The C programmeerimiskeel ei kasuta mälu eraldamiseks GC-d. Seetõttu peavad C-programmeerijad mälu käsitsi eraldama ja eraldama. C võimaldab dünaamilist mälu eraldamist, kui te ei tea kompileerimise ajal, kui palju mälu te tööajal kasutate.

Standardne teek (stdlib.h) sisaldab funktsioone, mida C kasutab dünaamilise mälujaotuse haldamiseks. Need funktsioonid hõlmavad järgmist:

  • malloc(): eraldab kindla suurusega mälu ja tagastab sellele mälule kursori. Kui operatsioonisüsteemi mälukogumis pole piisavalt vaba mälu, tagastab see null.
  • free(): eraldab kindla mäluploki ja tagastab selle operatsioonisüsteemi mälukogumile.

C Programmi näide

#sisaldama
#sisaldama

intpeamine()
{
int *ptr; // kursori deklareerimine
int j; // deklareeri loendur

// eraldab ruumi 200 täisarvu jaoks
ptr = (int *) malloc(200 * suurus(int));

// sisestage eraldatud mällu täisarvud
// ja printige iga väärtus konsooli
jaoks (j = 0; j < 200; j++)
{
ptr[j] = j;
printf("%d\t",ptr[j]);
}

// eraldab varem eraldatud mälu
tasuta(ptr);
tagasi0;
}

Ülaltoodud kood eraldab mälu 200 täisarvu väärtuse salvestamiseks, kasutades malloc() funktsiooni. See kasutab sellele mälukohale juurdepääsuks kursorit ja salvestab sinna 200 täisarvu. Samuti prindib kursor konsooli mälukohta salvestatud andmed. Lõpuks eraldab programm varem eraldatud mälu, kasutades tasuta () funktsiooni.

Mälu eraldamine prügikogujaga

Mitmed populaarsed programmeerimiskeeled kasutavad mälu haldamiseks GC-d. See muudab neid keeli kasutavate programmeerijate elu palju lihtsamaks. C# ja Java on kaks programmeerimiskeelt, mis kasutavad GC-d.

C# GC

Aastal C# programmeerimiskeel, GC haldab mäluaadresside eraldamist ja eraldamist. Seetõttu ei pea C# programmeerija muretsema objekti eraldamise pärast pärast selle eesmärgi täitmist.

C# GC lähtestab iga uue protsessi (või programmi) jaoks mälukogumi, mida nimetatakse hallatud hunnikuks. See kutsub VirtualAlloc() funktsioon mälu eraldamiseks ja VirtualFree() funktsioon selle eraldamiseks. Parim osa on see, et see kõik toimub taustal ilma teie, programmeerija, pingutuseta.

C# GC-l on optimeerimismootor, mille abil see otsustab, millal mälu vabastada. Optimeerimismootor uurib rakenduse juurt, et teha kindlaks, millised objektid pole enam kasutusel. See teeb seda, luues graafiku, mis ulatub rakenduse juurest ühendatud objektideni. See juur sisaldab staatilisi välju, kohalikke muutujaid jne. Kõik objektid, mis pole rakenduse juurega ühendatud, on prügi.

GC optimeerimismootor ei kogu ainult mälu iseseisvalt. Esmalt peab olema uus mälu eraldamise taotlus. Kui süsteemis on vähe vaba mälu, siis tuleb mängu GC optimeerimismootor.

Java GC

Javas haldab GC ka mäluaadresside eraldamist ja eraldamist. Java-l on praegu aga neli erinevat tüüpi toetatud prügikogujaid:

  • Prügi esimene (G1)
  • Sari
  • Paralleelselt
  • Z prügikoguja (ZGC)

G1 prügikoguja on Java vaike-GC alates Java arenduskomplekti (JDK) 9 väljalaskmisest. Java korraldab andmed objektides ja salvestab need objektid fikseeritud suurusega hunnikusse. G1 prügikoguja jagab hunniku võrdse suurusega hunnikuteks. Seejärel jagas see need kuhjapiirkonnad kaheks osaks; noored ja vanad põlvkonnad.

Iga kord, kui loote uue objekti, toimub selle objekti jaoks ruumi eraldamine noores põlvkonnas. Vananemisprotsessi kasutades kopeerib G1 prügikoguja noorte piirkondade objektid vanadesse piirkondadesse. Samuti kopeerib see objektid, mis on juba vanas piirkonnas, vanemasse piirkonda.

Seejärel teostab G1 prügikorjaja suurema osa oma mälu eraldamisest noores põlvkonnas, astudes aeg-ajalt ka vana põlvkonna sektsiooni.

Mis kasu on prügikorjast?

Prügikoguja eeliseks on see, et see ei lase teil koodi kirjutamise ajal mäluhaldusele mõelda. See annab teile aega keskenduda oma rakenduse muudele olulistele aspektidele. Siiski tasub esile tõsta mitmeid muid eeliseid.

Kasutamata objektide taastamine ja mälu vabastamine tagab rakenduse puhtama täitmise. Kui teie programm vabastab mälu niipea kui võimalik, on sellel väiksem mälumaht ja see võib töötada tõhusamalt.

Prügikoristus vähendab mäluhaldusega seotud vigu, nagu lekked ja osuti vead. Selle põhjuseks on asjaolu, et protsess ei sõltu enam programmeerijast ja tema võimest kirjutada täpset koodi.