Šiukšlių rinktuvas (GC) yra atminties tvarkyklė. Daugelis programavimo kalbų turi įmontuotą GC. Ši funkcija automatiškai paskirsto ir atlaisvina programos atmintį. Tai išlaisvina suvaržytą, nepanaudotą atmintį, kuri sulėtina programos veikimą.
GC grožis yra tas, kad jis išlaisvina atmintį jūsų vardu ir jums nieko nereikia daryti. Todėl galite laikyti, kad tai tokia esminė savybė, kurią tikitės turėti kiekviena programavimo kalba. Deja, taip nėra; net tokia populiari kalba kaip C gali trūkti GC.
Kaip veikia atminties paskirstymas?
Kai paleidžiate programą bet kuria programavimo kalba, jūsų operacinė sistema pasilieka a duomenų krūva atmintyje tai programai. Šiai programai priklauso ir ji užima šį duomenų krūvą, kol baigs vykdyti. Jei programai reikia daugiau atminties nei turima, ji gali dinamiškai skirti daugiau atminties iš operacinės sistemos atminties krūvos.
Programuojant kintamasis reiškia atminties vietą. Taigi, kai deklaruojate naują kintamąjį, programavimo kalba paskiria vietos atmintyje šiam kintamajam. Kintamasis dabar turės atminties adresą. Kol šiam kintamajam nepriskirsite reikšmės, jis liks nepainicialus ir jame gali būti tam tikra šiukšlių reikšmė.
Jei programavimo kalba leidžia deklaruoti kintamąjį jo neinicializuojant, tai yra dinaminis kintamasis. Tai reiškia, kad vertė, kurią priskiriate kintamajam, laikui bėgant gali keistis. Tačiau kintamojo atminties vieta išliks tokia pati, kol jo nepašalinsite.
Kaip veikia atminties paskirstymas?
Atminties paskirstymas yra panašus procesas visoms programavimo kalboms. Tačiau atitinkamas atminties išskyrimo metodas paprastai skiriasi. Yra dviejų tipų atminties panaikinimo metodai; rankinis ir automatinis. GC atlieka automatinį paskirstymą.
Atminties paskirstymas be šiukšlių surinkėjo
The C programavimo kalba nenaudoja GC atminties išlaisvinimui. Todėl C programuotojai turi rankiniu būdu paskirstyti ir atlaisvinti atmintį. C leidžia dinamiškai paskirstyti atmintį, kai kompiliavimo metu nežinote, kiek atminties sunaudosite vykdymo metu.
Standartinėje bibliotekoje (stdlib.h) yra funkcijos, kurias C naudoja dinaminiam atminties paskirstymui valdyti. Šios funkcijos apima:
- malloc (): paskiria tam tikrą atminties dydį ir grąžina žymeklį į tą atmintį. Jei operacinės sistemos atminties telkinyje nepakanka laisvos atminties, jis grąžina nulį.
- free (): išskiria tam tikrą atminties bloką ir grąžina jį į operacinės sistemos atminties telkinį.
C programos pavyzdys
#įtraukti
#įtrauktitarptpagrindinis()
{
tarpt *ptr; // paskelbti rodyklę
tarpt j; // deklaruoti skaitiklį// skirti vietos 200 sveikųjų skaičių
ptr = (tarpt *) malloc(200 * dydis(tarpt));// į skirtą atmintį įterpkite sveikųjų skaičių reikšmes
// ir atspausdinkite kiekvieną reikšmę konsolėje
dėl (j = 0; j < 200; j++)
{
ptr[j] = j;
printf("%d\t",ptr[j]);
}
// atlaisvinkite anksčiau skirtą atmintį
Laisvas(ptr);
grąžinti0;
}
Aukščiau pateiktas kodas skiria atmintį 200 sveikųjų skaičių reikšmių saugojimui naudojant malloc () funkcija. Šiai atminties vietai pasiekti naudojamas žymeklis ir joje išsaugoma 200 sveikųjų skaičių. Žymeklis taip pat atspausdina atminties vietoje saugomus duomenis į konsolę. Galiausiai programa atlaisvina anksčiau skirtą atmintį naudodama Laisvas() funkcija.
Atminties paskirstymas naudojant šiukšlių surinkėją
Kelios populiarios programavimo kalbos naudoja GC atminties valdymui. Tai labai palengvina programuotojų, naudojančių šias kalbas, gyvenimą. C# ir Java yra dvi programavimo kalbos, kurios naudoja GC.
C# GC
Viduje C# programavimo kalba, GC valdo atminties adresų paskirstymą ir išskirstymą. Todėl C# programuotojui nereikia jaudintis dėl objekto atšaukimo, kai jis įvykdys savo paskirtį.
C# GC inicijuoja atminties telkinį, vadinamą valdoma krūva, kiekvienam naujam procesui (arba programai). Tai vadina VirtualAlloc() funkcija paskirstyti atmintį ir VirtualFree () funkcija jį paskirstyti. Geriausia tai, kad visa tai vyksta fone, jums, programuotojui, nereikia jokių pastangų.
C# GC turi optimizavimo variklį, kurį naudoja, kad nuspręstų, kada atlaisvinti atmintį. Optimizavimo variklis tiria programos šaknį, kad nustatytų, kurie objektai nebenaudojami. Tai daroma sukuriant grafiką, kuris tęsiasi nuo programos šaknies iki prijungtų objektų. Ši šaknis apima statinius laukus, vietinius kintamuosius ir kt. Bet koks objektas, neprijungtas prie programos šaknies, yra šiukšlės.
GC optimizavimo variklis ne tik renka atmintį. Pirmiausia turi būti pateikta nauja atminties paskirstymo užklausa. Jei sistemoje yra mažai laisvos atminties, pradės veikti GC optimizavimo variklis.
Java GC
Java programoje GC taip pat valdo atminties adresų paskirstymą ir išskirstymą. Tačiau šiuo metu „Java“ turi keturis skirtingus palaikomų šiukšlių rinktuvų tipus:
- Šiukšlės pirmas (G1)
- Serijinis
- Lygiagretus
- Z šiukšlių surinkėjas (ZGC)
G1 šiukšlių rinktuvas yra numatytasis „Java“ GC nuo „Java Development Kit“ (JDK) 9 išleidimo. Java tvarko duomenis objektuose ir saugo šiuos objektus fiksuoto dydžio krūvoje. G1 šiukšlių rinktuvas padalija krūvą į vienodo dydžio krūvos sritis. Tada jis padalijo šiuos krūvos regionus į dvi dalis; jaunosios ir senosios kartos.
Kiekvieną kartą kuriant naują objektą, vietos paskirstymas šiam objektui vyksta jaunojoje kartoje. Naudodamas senėjimo procesą, G1 šiukšlių surinkėjas nukopijuoja objektus jaunuose regionuose į senus regionus. Ji taip pat kopijuoja objektus, kurie jau yra sename regione, į senesnį regioną.
Tada G1 šiukšlių surinkėjas didžiąją dalį savo atminties išlaisvina jaunojoje kartoje, retkarčiais pereidamas į senosios kartos skyrių.
Kokie yra šiukšlių surinkėjo privalumai?
Šiukšlių rinktuvo pranašumas yra tas, kad rašant kodą jis neleidžia galvoti apie atminties valdymą. Tai suteikia jums laiko sutelkti dėmesį į kitus svarbius programos aspektus. Tačiau verta pabrėžti keletą kitų privalumų.
Nenaudojamų objektų atkūrimas ir atminties atlaisvinimas užtikrina švaresnį programų vykdymą. Jei jūsų programa atlaisvins atmintį kuo greičiau, ji turės mažesnį atminties plotą ir gali veikti efektyviau.
Šiukšlių surinkimas sumažina su atminties valdymu susijusių klaidų, pvz., nutekėjimo ir rodyklės klaidų, skaičių. Taip yra todėl, kad procesas nebepriklauso nuo programuotojo ir jo gebėjimo parašyti tikslų kodą.