Sakupljač smeća (GC) je upravitelj memorije. Mnogi programski jezici imaju ugrađeni GC. Ova značajka automatski dodjeljuje i oslobađa memoriju u programu. Oslobađa zauzetu, neiskorištenu memoriju koja usporava vašu aplikaciju.
Ljepota GC-a je u tome što oslobađa memoriju u vaše ime, a da vi ne morate ništa učiniti. Stoga biste to mogli smatrati toliko bitnom značajkom da biste očekivali da je ima svaki programski jezik. Nažalost, to nije slučaj; čak i popularan jezik poput C može nedostajati GC.
Kako funkcionira dodjela memorije?
Kada pokrenete program u bilo kojem programskom jeziku, vaš operativni sustav rezervira a hrpu podataka u memoriji za taj program. Ovaj program posjeduje i zauzima ovaj skup podataka dok ne dovrši izvršenje. Ako vaš program treba više memorije od onoga što je dostupno, može dinamički dodijeliti više memorije iz memorijske hrpe operativnog sustava.
U programiranju varijabla predstavlja memorijsku lokaciju. Dakle, kada deklarirate novu varijablu, programski jezik dodjeljuje prostor u memoriji za tu varijablu. Varijabla će sada imati memorijsku adresu. Sve dok ovoj varijabli ne dodijelite vrijednost, ona će ostati neinicijalizirana i može sadržavati neku nepotrebnu vrijednost.
Ako vam programski jezik dopušta deklariranje varijable bez inicijalizacije, onda je to dinamička varijabla. To znači da se vrijednost koju dodijelite varijabli može promijeniti tijekom vremena. Međutim, memorijska lokacija varijable ostat će ista dok je ne oslobodite.
Kako funkcionira dealokacija memorije?
Dodjela memorije je sličan proces za sve programske jezike. Ali odgovarajuća metoda oslobađanja memorije obično se razlikuje. Postoje dvije vrste metoda oslobađanja memorije; ručni i automatski. GC vrši automatsku dealokaciju.
Dealokacija memorije bez skupljača smeća
The C programski jezik ne koristi GC za oslobađanje memorije. Stoga C programeri moraju ručno dodijeliti i osloboditi memoriju. C dopušta dinamičku dodjelu memorije kada ne znate, u vrijeme kompajliranja, koliko ćete memorije koristiti u vremenu izvođenja.
Standardna biblioteka (stdlib.h) sadrži funkcije koje C koristi za upravljanje dinamičkom dodjelom memorije. Ove funkcije uključuju:
- malloc(): dodjeljuje određenu veličinu memorije i vraća pokazivač na tu memoriju. Ako u spremištu memorije operativnog sustava nema dovoljno dostupne memorije, vraća null.
- free(): oslobađa određeni blok memorije i vraća ga u spremište memorije operativnog sustava.
Primjer C programa
#uključiti
#uključitiintglavni()
{
int *ptr; // deklariraj pokazivač
int j; // deklariraj brojač// dodijeliti prostor za 200 cijelih brojeva
ptr = (int *) malloc(200 * veličina(int));// umetanje cjelobrojnih vrijednosti u dodijeljenu memoriju
// i ispišite svaku vrijednost na konzolu
za (j = 0; j < 200; j++)
{
ptr[j] = j;
printf("%d\t",ptr[j]);
}
// osloboditi prethodno dodijeljenu memoriju
besplatno(ptr);
povratak0;
}
Gornji kod dodjeljuje memoriju za pohranu 200 cjelobrojnih vrijednosti pomoću malloc() funkcija. Koristi pokazivač za pristup ovoj memorijskoj lokaciji i pohranjuje 200 cijelih vrijednosti u njoj. Pokazivač također ispisuje podatke pohranjene na memorijskoj lokaciji na konzolu. Na kraju, program oslobađa prethodno dodijeljenu memoriju pomoću besplatno() funkcija.
Dealokacija memorije pomoću skupljača smeća
Nekoliko popularnih programskih jezika koristi GC za upravljanje memorijom. To znatno olakšava život programera koji koriste te jezike. C# i Java su dva programska jezika koji koriste GC.
C# GC
u C# programski jezik, GC upravlja dodjelom i poništavanjem memorijskih adresa. Stoga se C# programer ne treba brinuti o poništavanju objekta nakon što ispuni svoju svrhu.
C# GC inicijalizira memorijsko spremište, koje se naziva upravljana gomila, za svaki novi proces (ili program). Poziva se VirtualAlloc() funkcija za dodjelu memorije i VirtualFree() funkciju za njegovo oslobađanje. Najbolji dio je što se sve to događa u pozadini bez ikakvog napora od vas, programera.
C# GC ima mehanizam za optimizaciju, koji koristi za odlučivanje kada osloboditi memoriju. Stroj za optimizaciju ispituje korijen aplikacije kako bi odredio koji se objekti više ne koriste. To čini stvaranjem grafikona koji se proteže od korijena aplikacije do povezanih objekata. Ovaj korijen uključuje statička polja, lokalne varijable itd. Svaki objekt koji nije povezan s korijenom aplikacije je smeće.
GC optimizacijski mehanizam ne prikuplja samo memoriju sam. Prvo mora postojati novi zahtjev za dodjelu memorije. Ako sustav ima malu količinu dostupne memorije, tada će motor za optimizaciju GC-a doći u igru.
Java GC
U Javi, GC također upravlja dodjelom i poništavanjem memorijskih adresa. Međutim, Java trenutno ima četiri različite vrste podržanih skupljača smeća:
- Prvo smeće (G1)
- Serijski
- Paralelno
- Z sakupljač smeća (ZGC)
G1 skupljač smeća je Java-in default GC od izdanja Java Development Kit-a (JDK) 9. Java organizira podatke u objekte i pohranjuje te objekte u gomilu fiksne veličine. Skupljač smeća G1 dijeli gomilu na područja hrpe jednake veličine. Zatim je podijelio te regije hrpe u dva dijela; mlade i stare generacije.
Svaki put kada kreirate novi objekt, dodjela prostora za ovaj objekt događa se u mladoj generaciji. Koristeći proces starenja, G1 skupljač smeća kopira objekte iz mladih regija u stare regije. Također kopira objekte koji su već u staroj regiji u stariju regiju.
Skupljač smeća G1 zatim obavlja većinu svoje dealokacije memorije u mladoj generaciji, povremeno se usmjeravajući na odjeljak stare generacije.
Koje su prednosti posjedovanja sakupljača smeća?
Prednost postojanja skupljača smeća je ta što vas sprječava da razmišljate o upravljanju memorijom dok pišete svoj kod. To vam daje vremena da se usredotočite na druge važne aspekte svoje prijave. Međutim, vrijedi istaknuti nekoliko drugih prednosti.
Vraćanje neiskorištenih objekata i oslobađanje memorije osigurava čistije izvršavanje aplikacija. Ako vaš program oslobodi memoriju što je prije moguće, imat će manji memorijski otisak i moći će raditi učinkovitije.
Skupljanje smeća smanjuje pogreške povezane s upravljanjem memorijom kao što su curenja i pogreške pokazivača. To je zato što proces više ne ovisi o programeru i njegovoj sposobnosti da napiše točan kod.