Roskakori (GC) on muistinhallinta. Monissa ohjelmointikielissä on sisäänrakennettu GC. Tämä ominaisuus varaa ja vapauttaa automaattisesti ohjelman muistin. Se vapauttaa sidotun, käyttämättömän muistin, joka hidastaa sovellusta.

GC: n kauneus on, että se vapauttaa muistia puolestasi ilman, että sinun tarvitsee tehdä mitään. Siksi saatat pitää sitä niin tärkeänä ominaisuutena, että sen voisi odottaa olevan joka ohjelmointikielellä. Valitettavasti näin ei ole; jopa suositusta kielestä, kuten C, voi puuttua GC.

Kuinka muistin varaus toimii?

Kun suoritat ohjelman millä tahansa ohjelmointikielellä, käyttöjärjestelmäsi varaa a tietopino muistissa sille ohjelmalle. Tämä ohjelma omistaa ja käyttää tätä tietopinoa, kunnes sen suorittaminen on valmis. Jos ohjelmasi tarvitsee enemmän muistia kuin mitä on käytettävissä, se voi varata dynaamisesti enemmän muistia käyttöjärjestelmän muistikasasta.

Ohjelmoinnissa muuttuja edustaa muistipaikkaa. Joten kun ilmoitat uuden muuttujan, ohjelmointikieli varaa muistia tälle muuttujalle. Muuttujalla on nyt muistiosoite. Ennen kuin annat tälle muuttujalle arvon, se pysyy alustamattomana ja se saattaa sisältää roskaarvoa.

instagram viewer

Jos ohjelmointikielen avulla voit ilmoittaa muuttujan alustamatta sitä, se on dynaaminen muuttuja. Tämä tarkoittaa, että muuttujalle antamasi arvo saattaa muuttua ajan myötä. Muuttujan muistipaikka pysyy kuitenkin samana, kunnes poistat sen.

Kuinka muistin varaaminen toimii?

Muistin varaus on samanlainen prosessi kaikille ohjelmointikielille. Mutta vastaava muistin purkamismenetelmä vaihtelee. Muistin purkamismenetelmiä on kahdenlaisia; manuaalinen ja automaattinen. GC tekee automaattisen jakelun.

Muistin jakaminen ilman roskienkerääjää

The C-ohjelmointikieli ei käytä GC: tä muistin purkamiseen. Siksi C-ohjelmoijien täytyy varata ja vapauttaa muisti manuaalisesti. C mahdollistaa dynaamisen muistin varauksen, kun et tiedä käännöshetkellä, kuinka paljon muistia käytät ajon aikana.

Vakiokirjasto (stdlib.h) sisältää funktiot, joita C käyttää dynaamisen muistin varauksen hallintaan. Näitä toimintoja ovat:

  • malloc(): varaa tietyn koon muistia ja palauttaa osoittimen kyseiseen muistiin. Jos käyttöjärjestelmän muistivarastossa ei ole tarpeeksi muistia, se palauttaa tyhjän.
  • free(): vapauttaa tietyn muistilohkon ja palauttaa sen käyttöjärjestelmän muistivarastoon.

C Ohjelmaesimerkki

#sisältää
#sisältää

intpää()
{
int *ptr; // ilmoittaa osoitin
int j; // ilmoittaa laskuri

// varaa tilaa 200 kokonaisluvulle
ptr = (int *) malloc(200 * koko(int));

// lisää kokonaislukuarvot varattuun muistiin
// ja tulosta jokainen arvo konsoliin
varten (j = 0; j < 200; j++)
{
ptr[j] = j;
printf("%d\t",ptr[j]);
}

// vapauttaa aiemmin varatun muistin
vapaa(ptr);
palata0;
}

Yllä oleva koodi varaa muistia 200 kokonaislukuarvon tallentamiseen käyttämällä malloc() toiminto. Se käyttää osoitinta päästäkseen tähän muistipaikkaan ja tallentaa siihen 200 kokonaislukuarvoa. Osoitin tulostaa myös muistipaikkaan tallennetut tiedot konsoliin. Lopuksi ohjelma vapauttaa aiemmin varatun muistin käyttämällä vapaa() toiminto.

Muistin jakaminen roskienkerääjällä

Useat suositut ohjelmointikielet käyttävät GC: tä muistin hallintaan. Tämä helpottaa huomattavasti näitä kieliä käyttävien ohjelmoijien elämää. C# ja Java ovat kaksi ohjelmointikieltä, jotka käyttävät GC: tä.

C# GC

Vuonna C# ohjelmointikieli, GC hallitsee muistiosoitteiden varaamista ja purkamista. Siksi C#-ohjelmoijan ei tarvitse huolehtia objektin purkamisesta sen jälkeen, kun se on suorittanut tarkoituksensa.

C# GC alustaa muistivaraston, jota kutsutaan hallitukseksi kasoksi, jokaista uutta prosessia (tai ohjelmaa) varten. Se kutsuu VirtualAlloc() toiminto muistin varaamiseen ja VirtualFree() toiminto sen jakamiseksi. Parasta on, että tämä kaikki tapahtuu taustalla ilman, että sinulta, ohjelmoijalta, vaaditaan vaivaa.

C# GC: ssä on optimointimoottori, jota se käyttää päättääkseen, milloin muistia puretaan. Optimointimoottori tutkii sovelluksen juuria määrittääkseen, mitkä objektit eivät ole enää käytössä. Se tekee tämän luomalla kaavion, joka ulottuu sovelluksen juuresta yhdistettyihin objekteihin. Tämä juuri sisältää staattiset kentät, paikalliset muuttujat jne. Kaikki objektit, joita ei ole yhdistetty sovelluksen juureen, ovat roskaa.

GC-optimointimoottori ei vain kerää muistia yksinään. Ensin on esitettävä uusi muistinvarauspyyntö. Jos järjestelmässä on vähän vapaata muistia, GC-optimointimoottori tulee käyttöön.

Java GC

Javassa GC hallitsee myös muistiosoitteiden varaamista ja purkamista. Javalla on kuitenkin tällä hetkellä neljä erilaista tuettua roskakeräystä:

  • Garbage-First (G1)
  • Sarja
  • Rinnakkainen
  • Z Roskakeräys (ZGC)

G1-jätteenkeräin on Javan oletusarvoinen GC Java Development Kit (JDK) 9:n julkaisusta lähtien. Java järjestää tiedot objekteihin ja tallentaa nämä objektit kiinteän kokoiseen kasaan. G1-jätteenkeräin jakaa kasan samankokoisiin kasa-alueisiin. Sitten se jakoi nämä kasa-alueet kahteen osaan; nuoret ja vanhat sukupolvet.

Joka kerta kun luot uuden objektin, tälle objektille varataan tilaa nuorelle sukupolvelle. Ikääntymisprosessin avulla G1-jätteenkeräin kopioi nuorten alueiden esineet vanhoille alueille. Se myös kopioi vanhalla alueella olevat objektit vanhemmalle alueelle.

G1-jätteenkeräilijä suorittaa sitten suurimman osan muistin purkamisesta nuorelle sukupolvelle, uskaltautuen toisinaan vanhan sukupolven osioon.

Mitä etuja roskakoriin on?

Roskakeräimen etuna on, että se estää sinua ajattelemasta muistinhallintaa koodia kirjoittaessasi. Tämä antaa sinulle aikaa keskittyä hakemuksesi muihin tärkeisiin näkökohtiin. Useita muita etuja kannattaa kuitenkin korostaa.

Käyttämättömien kohteiden talteenotto ja muistin vapauttaminen mahdollistavat sovellusten puhtaamman suorituskyvyn. Jos ohjelmasi vapauttaa muistia mahdollisimman pian, sillä on pienempi muistitila ja se voi toimia tehokkaammin.

Roskien kerääminen vähentää muistinhallintaan liittyviä virheitä, kuten vuotoja ja osoitinvirheitä. Tämä johtuu siitä, että prosessi ei ole enää riippuvainen ohjelmoijasta ja hänen kyvystään kirjoittaa tarkkaa koodia.