Atkritumu savācējs (GC) ir atmiņas pārvaldnieks. Daudzām programmēšanas valodām ir iebūvēts GC. Šī funkcija automātiski piešķir un atbrīvo programmas atmiņu. Tas atbrīvo noslogotu, neizmantotu atmiņu, kas palēnina lietojumprogrammas darbību.

GC skaistums ir tāds, ka tas atbrīvo atmiņu jūsu vārdā, jums nekas nav jādara. Tāpēc jūs to varētu uzskatīt par tik būtisku līdzekli, ka jūs varētu sagaidīt, ka tā būs katrā programmēšanas valodā. Diemžēl tas tā nav; pat tādā populārā valodā kā C var trūkt GC.

Kā darbojas atmiņas piešķiršana?

Palaižot programmu jebkurā programmēšanas valodā, jūsu operētājsistēma rezervē a datu kaudze atmiņā šai programmai. Šai programmai pieder un aizņem šo datu steks, līdz tā pabeidz izpildi. Ja programmai ir nepieciešams vairāk atmiņas, nekā ir pieejama, tā var dinamiski piešķirt vairāk atmiņas no operētājsistēmas atmiņas kaudzes.

Programmēšanā mainīgais apzīmē atmiņas vietu. Tātad, deklarējot jaunu mainīgo, programmēšanas valoda šim mainīgajam piešķir vietu atmiņā. Mainīgajam tagad būs atmiņas adrese. Kamēr šim mainīgajam nepiešķirat vērtību, tas paliks neinicializēts un tajā var būt ietverta kāda atkrituma vērtība.

Ja programmēšanas valoda ļauj deklarēt mainīgo bez tā inicializācijas, tad tas ir dinamisks mainīgais. Tas nozīmē, ka mainīgajam piešķirtā vērtība laika gaitā var mainīties. Tomēr mainīgā atrašanās vieta atmiņā paliks nemainīga, līdz to atdalīsit.

Kā darbojas atmiņas sadale?

Atmiņas piešķiršana ir līdzīgs process visām programmēšanas valodām. Bet atbilstošā atmiņas izvietošanas metode mēdz atšķirties. Ir divu veidu atmiņas atdalīšanas metodes; manuāla un automātiska. GC veic automātisku sadali.

Atmiņas sadale bez atkritumu savācēja

The C programmēšanas valoda neizmanto GC atmiņas atdalīšanai. Tāpēc C programmētājiem ir manuāli jāpiešķir un jāatdala atmiņa. C ļauj dinamiski piešķirt atmiņu, ja kompilēšanas laikā nezināt, cik daudz atmiņas izmantosit izpildes laikā.

Standarta bibliotēkā (stdlib.h) ir ietvertas funkcijas, kuras C izmanto, lai pārvaldītu dinamisko atmiņas piešķiršanu. Šīs funkcijas ietver:

  • malloc (): piešķir noteiktu atmiņas lielumu un atgriež rādītāju uz šo atmiņu. Ja operētājsistēmas atmiņas pūlā nav pietiekami daudz atmiņas, tas atgriež nulli.
  • free (): atbrīvo noteiktu atmiņas bloku un atgriež to operētājsistēmas atmiņas pūlā.

C Programmas piemērs

#ietver
#ietver

starptgalvenais()
{
starpt *ptr; // deklarēt rādītāju
starpt j; // deklarēt skaitītāju

// piešķir vietu 200 veseliem skaitļiem
ptr = (starpt *) malloc(200 * izmērs(starpt));

// ievietojiet veselu skaitļu vērtības piešķirtajā atmiņā
// un izdrukājiet katru vērtību konsolē
priekš (j = 0; j < 200; j++)
{
ptr[j] = j;
printf("%d\t",ptr[j]);
}

// atdala iepriekš piešķirto atmiņu
bezmaksas(ptr);
atgriezties0;
}

Iepriekš minētais kods piešķir atmiņu, lai saglabātu 200 veselu skaitļu vērtības, izmantojot malloc () funkciju. Tas izmanto rādītāju, lai piekļūtu šai atmiņas vietai, un saglabā tajā 200 veselu skaitļu vērtības. Rādītājs konsolē drukā arī atmiņas vietā saglabātos datus. Visbeidzot, programma atbrīvo iepriekš piešķirto atmiņu, izmantojot bezmaksas () funkciju.

Atmiņas sadale ar atkritumu savācēju

Vairākas populāras programmēšanas valodas izmanto GC atmiņas pārvaldībai. Tas ievērojami atvieglo programmētāju dzīvi, kuri izmanto šīs valodas. C# un Java ir divas programmēšanas valodas, kas izmanto GC.

C# GC

Iekš C# programmēšanas valoda, GC pārvalda atmiņas adrešu piešķiršanu un atdalīšanu. Tāpēc C# programmētājam nav jāuztraucas par objekta atdalīšanu pēc tam, kad tas ir izpildījis savu mērķi.

C# GC inicializē atmiņas pūlu, ko sauc par pārvaldīto kaudzi, katram jaunam procesam (vai programmai). To sauc par VirtualAlloc() funkcija, lai piešķirtu atmiņu un VirtualFree() funkciju, lai to sadalītu. Pats labākais ir tas, ka tas viss notiek fonā, un jums, programmētājam, nav jāpieliek nekādas pūles.

C# GC ir optimizācijas dzinējs, ko tas izmanto, lai izlemtu, kad atdalīt atmiņu. Optimizēšanas programma pārbauda lietojumprogrammas sakni, lai noteiktu, kuri objekti vairs netiek izmantoti. Tas tiek darīts, izveidojot grafiku, kas stiepjas no lietojumprogrammas saknes līdz savienotajiem objektiem. Šī sakne ietver statiskus laukus, vietējos mainīgos utt. Jebkurš objekts, kas nav savienots ar lietojumprogrammas sakni, ir atkritums.

GC optimizēšanas dzinējs ne tikai apkopo atmiņu pats par sevi. Vispirms ir jābūt jaunam atmiņas piešķiršanas pieprasījumam. Ja sistēmai ir maz pieejamās atmiņas, tiks izmantots GC optimizācijas dzinējs.

Java GC

Java valodā GC pārvalda arī atmiņas adrešu piešķiršanu un atdalīšanu. Tomēr Java pašlaik ir četri dažādi atbalstīto atkritumu savācēju veidi:

  • Atkritumi vispirms (G1)
  • Seriāls
  • Paralēli
  • Z atkritumu savācējs (ZGC)

G1 atkritumu savācējs ir Java noklusējuma GC kopš Java izstrādes komplekta (JDK) 9 izlaišanas. Java organizē datus objektos un saglabā šos objektus fiksēta izmēra kaudzē. G1 atkritumu savācējs sadala kaudzi vienāda izmēra kaudzes reģionos. Pēc tam tas sadalīja šos kaudzes reģionus divās daļās; jaunās un vecās paaudzes.

Katru reizi, kad veidojat jaunu objektu, telpas piešķiršana šim objektam notiek jaunajā paaudzē. Izmantojot novecošanas procesu, atkritumu savācējs G1 kopē objektus jaunajos reģionos uz vecajiem reģioniem. Tā arī kopē objektus, kas jau atrodas vecajā reģionā, uz vecāku reģionu.

Pēc tam G1 atkritumu savācējs lielāko daļu atmiņas atdala jaunajā paaudzē, laiku pa laikam dodoties uz vecās paaudzes sadaļu.

Kādas ir atkritumu savācēja priekšrocības?

Atkritumu savācēja priekšrocība ir tāda, ka tas neļauj domāt par atmiņas pārvaldību, rakstot kodu. Tas dod jums laiku koncentrēties uz citiem svarīgiem jūsu pieteikuma aspektiem. Tomēr ir vērts izcelt vairākas citas priekšrocības.

Neizmantoto objektu atgūšana un atmiņas atbrīvošana nodrošina tīrāku lietojumprogrammu izpildi. Ja programma pēc iespējas ātrāk atbrīvo atmiņu, tai būs mazāks atmiņas apjoms un tā var darboties efektīvāk.

Atkritumu savākšana samazina kļūdas, kas saistītas ar atmiņas pārvaldību, piemēram, noplūdes un rādītāja kļūdas. Tas ir tāpēc, ka process vairs nav atkarīgs no programmētāja un viņa spējas rakstīt precīzu kodu.