En søppelsamler (GC) er en minnebehandler. Mange programmeringsspråk har en innebygd GC. Denne funksjonen tildeler og tildeler automatisk minnet i et program. Den frigjør bundet, ubrukt minne som bremser applikasjonen din.
Det fine med en GC er at den frigjør minne på dine vegne, uten at du trenger å gjøre noe. Du kan derfor vurdere det som en så viktig funksjon at du forventer at alle programmeringsspråk har den. Dessverre er dette ikke tilfelle; selv et populært språk som C kan mangle en GC.
Hvordan fungerer minnetildeling?
Når du kjører et program på et hvilket som helst programmeringsspråk, reserverer operativsystemet ditt en datastabel i minnet for det programmet. Dette programmet eier og okkuperer denne datastakken til den fullfører kjøringen. Hvis programmet ditt trenger mer minne enn det som er tilgjengelig, kan det dynamisk tildele mer minne fra operativsystemets minnehaug.
I programmering representerer en variabel en minneplassering. Så når du erklærer en ny variabel, tildeler programmeringsspråket plass i minnet for denne variabelen. Variabelen vil nå ha en minneadresse. Inntil du tilordner en verdi til denne variabelen vil den forbli uinitialisert, og den kan inneholde en søppelverdi.
Hvis et programmeringsspråk lar deg deklarere en variabel uten å initialisere den, er det en dynamisk variabel. Dette betyr at verdien du tildeler variabelen kan endre seg over tid. Imidlertid vil minneplasseringen til variabelen forbli den samme til du deallokerer den.
Hvordan fungerer minnedeallokering?
Minnetildeling er en lignende prosess for alle programmeringsspråk. Men den tilsvarende metoden for minnedeallokering har en tendens til å variere. Det er to typer minnedeallokeringsmetoder; manuell og automatisk. En GC gjør automatisk deallokering.
Minnetildeling uten en søppeloppsamler
De C programmeringsspråk bruker ikke en GC for minnedeallokering. Derfor må C-programmerere manuelt allokere og deallokere minne. C tillater dynamisk minneallokering for når du ikke vet, på kompileringstidspunktet, hvor mye minne du vil bruke på kjøretid.
Standardbiblioteket (stdlib.h) inneholder funksjonene som C bruker for å administrere dynamisk minneallokering. Disse funksjonene inkluderer:
- malloc(): tildeler en spesifikk størrelse på minnet og returnerer en peker til det minnet. Hvis det ikke er nok minne tilgjengelig i operativsystemets minnepool, returnerer det null.
- free(): tildeler en spesifikk minneblokk og returnerer den til operativsystemets minnepool.
C Programeksempel
#inkludere
#inkludereinthoved-()
{
int *ptr; // erklære pekeren
int j; // erklære teller// alloker plass til 200 heltall
ptr = (int *) malloc(200 * størrelsen av(int));// sett inn heltallsverdier i minnet som er tildelt
// og skriv ut hver verdi til konsollen
til (j = 0; j < 200; j++)
{
ptr[j] = j;
printf("%d\t",ptr[j]);
}
// dealloker det tidligere tildelte minnet
gratis(ptr);
komme tilbake0;
}
Koden ovenfor tildeler minne til å lagre 200 heltallsverdier ved å bruke malloc() funksjon. Den bruker en peker for å få tilgang til denne minneplasseringen og lagrer 200 heltallsverdier i den. Pekeren skriver også ut dataene som er lagret på minnestedet til konsollen. Til slutt tildeler programmet det tidligere tildelte minnet ved å bruke gratis() funksjon.
Minnetildeling med en søppeloppsamler
Flere populære programmeringsspråk bruker en GC for minnebehandling. Dette gjør livet til programmerere som bruker disse språkene mye enklere. C# og Java er to programmeringsspråk som bruker en GC.
C# GC
I C# programmeringsspråk, en GC styrer tildelingen og deallokeringen av minneadresser. Derfor trenger ikke en C#-programmerer å bekymre seg for å deallokere et objekt etter at det har fullført formålet.
C# GC initialiserer en minnepool, kalt den administrerte haugen, for hver ny prosess (eller program). Den kaller VirtualAlloc() funksjon for å tildele minne og VirtualFree() funksjon for å tildele den. Det beste er at alt dette skjer i bakgrunnen uten at det kreves noen innsats fra deg, programmereren.
C# GC har en optimaliseringsmotor, som den bruker for å bestemme når minnet skal tildeles. Optimaliseringsmotoren undersøker applikasjonsroten for å finne ut hvilke objekter som ikke lenger er i bruk. Den gjør dette ved å lage en graf som strekker seg fra roten av applikasjonen til tilkoblede objekter. Denne roten inkluderer statiske felt, lokale variabler, etc. Ethvert objekt som ikke er koblet til applikasjonsroten, er søppel.
GC-optimaliseringsmotoren samler ikke bare minne på egen hånd. Det må først være en ny minnetildelingsforespørsel. Hvis systemet har en lav mengde tilgjengelig minne, vil GC-optimaliseringsmotoren spille inn.
Java GC
I Java administrerer en GC også tildeling og deallokering av minneadresser. Imidlertid har Java for øyeblikket fire forskjellige typer støttede søppelsamlere:
- Søppel-først (G1)
- Seriell
- Parallell
- Z Garbage Collector (ZGC)
G1 søppelsamleren er Javas standard GC siden utgivelsen av Java Development Kit (JDK) 9. Java organiserer data i objekter og lagrer disse objektene i en haug med fast størrelse. G1 søppeloppsamleren deler haugen i like store haugområder. Den delte deretter disse haugområdene i to seksjoner; unge og gamle generasjoner.
Hver gang du oppretter et nytt objekt, skjer plassallokering for dette objektet i den unge generasjonen. Ved hjelp av en aldringsprosess kopierer G1 søppelsamleren gjenstander i de unge regionene til de gamle regionene. Den kopierer også objekter som allerede er i den gamle regionen til en eldre region.
G1 søppelsamleren utfører deretter det meste av minnetildelingen i den unge generasjonen, og av og til våger den gamle generasjonsdelen.
Hva er fordelene med å ha en søppeloppsamler?
Fordelen med å ha en søppeloppsamler er at den hindrer deg i å tenke på minnehåndtering mens du skriver koden. Dette gir deg tid til å fokusere på de andre viktige aspektene ved søknaden din. Flere andre fordeler er imidlertid verdt å trekke frem.
Gjenvinning av ubrukte objekter og frigjøring av minne gir renere applikasjonskjøring. Hvis programmet frigjør minne så snart som mulig, vil det ha et mindre minneavtrykk og kan kjøre mer effektivt.
Søppelinnsamling reduserer feil relatert til minnehåndtering som lekkasjer og pekerfeil. Dette er fordi prosessen ikke lenger er avhengig av programmereren og deres evne til å skrive nøyaktig kode.