En garbage collector (GC) er en memory manager. Mange programmeringssprog har en indbygget GC. Denne funktion tildeler og deallokerer automatisk hukommelsen i et program. Det frigiver bundet, ubrugt hukommelse, der gør din applikation langsommere.
Skønheden ved en GC er, at den frigiver hukommelse på dine vegne, uden at du behøver at gøre noget. Du kan derfor betragte det som en så væsentlig funktion, at du forventer, at alle programmeringssprog har det. Desværre er dette ikke tilfældet; selv et populært sprog som C kan mangle en GC.
Hvordan fungerer hukommelsestildeling?
Når du kører et program på et hvilket som helst programmeringssprog, reserverer dit operativsystem en datastak i hukommelsen for det program. Dette program ejer og optager denne datastak, indtil den fuldfører eksekveringen. Hvis dit program har brug for mere hukommelse, end hvad der er tilgængeligt, kan det dynamisk allokere mere hukommelse fra operativsystemets hukommelsesbunke.
Ved programmering repræsenterer en variabel en hukommelsesplacering. Så når du erklærer en ny variabel, tildeler programmeringssproget plads i hukommelsen til denne variabel. Variablen vil nu have en hukommelsesadresse. Indtil du tildeler en værdi til denne variabel, vil den forblive uinitialiseret, og den kan indeholde en eller anden skraldværdi.
Hvis et programmeringssprog tillader dig at erklære en variabel uden at initialisere den, så er det en dynamisk variabel. Det betyder, at den værdi, du tildeler variablen, kan ændre sig over tid. Variablens hukommelsesplacering vil dog forblive den samme, indtil du deallokerer den.
Hvordan fungerer hukommelsesdeallokering?
Hukommelsestildeling er en lignende proces for alle programmeringssprog. Men den tilsvarende metode til hukommelsesdeallokering har en tendens til at variere. Der er to typer hukommelsesdeallokeringsmetoder; manuel og automatisk. En GC foretager automatisk deallokering.
Hukommelsestildeling uden en skraldeopsamler
Det C programmeringssprog bruger ikke en GC til hukommelsesdeallokering. Derfor skal C-programmører manuelt allokere og deallokere hukommelse. C tillader dynamisk hukommelsesallokering, når du på kompileringstidspunktet ikke ved, hvor meget hukommelse du vil bruge på kørselstidspunktet.
Standardbiblioteket (stdlib.h) indeholder de funktioner, som C bruger til at styre dynamisk hukommelsesallokering. Disse funktioner omfatter:
- malloc(): allokerer en specifik størrelse af hukommelsen og returnerer en pointer til denne hukommelse. Hvis der ikke er tilstrækkelig hukommelse til rådighed i operativsystemets hukommelsespulje, returnerer den null.
- free(): tildeler en bestemt hukommelsesblok og returnerer den til operativsystemets hukommelsespulje.
C Programeksempel
#omfatte
#omfatteintvigtigste()
{
int *ptr; // erklære pointer
int j; // erklære tæller// alloker plads til 200 heltal
ptr = (int *) malloc(200 * størrelse på(int));// indsæt heltalsværdier i den tildelte hukommelse
// og udskriv hver værdi til konsollen
til (j = 0; j < 200; j++)
{
ptr[j] = j;
printf("%d\t",ptr[j]);
}
// dealloker den tidligere tildelte hukommelse
ledig(ptr);
Vend tilbage0;
}
Ovenstående kode tildeler hukommelse til at gemme 200 heltalsværdier ved hjælp af malloc() fungere. Den bruger en markør til at få adgang til denne hukommelsesplacering og gemmer 200 heltalsværdier i den. Markøren udskriver også de data, der er gemt på hukommelsesstedet, til konsollen. Endelig deallokerer programmet den tidligere tildelte hukommelse ved hjælp af ledig() fungere.
Hukommelsestildeling med en skraldeopsamler
Flere populære programmeringssprog bruger en GC til hukommelsesstyring. Dette gør livet for programmører, der bruger disse sprog, meget lettere. C# og Java er to programmeringssprog, der bruger en GC.
C# GC
I den C# programmeringssprog, en GC styrer allokeringen og deallokeringen af hukommelsesadresser. Derfor behøver en C#-programmør ikke at bekymre sig om at deallokere et objekt, efter at det har fuldført sit formål.
C# GC initialiserer en hukommelsespulje, kaldet den administrerede heap, for hver ny proces (eller program). Det kalder VirtualAlloc() funktion til at allokere hukommelse og VirtualFree() funktion til at tildele den. Det bedste er, at alt dette sker i baggrunden uden at kræve en indsats fra dig, programmøren.
C# GC har en optimeringsmotor, som den bruger til at bestemme, hvornår hukommelsen skal deallokeres. Optimeringsmotoren undersøger applikationsroden for at bestemme, hvilke objekter der ikke længere er i brug. Det gør den ved at skabe en graf, der strækker sig fra programmets rod til forbundne objekter. Denne rod inkluderer statiske felter, lokale variabler osv. Ethvert objekt, der ikke er forbundet til applikationsroden, er skrald.
GC-optimeringsmotoren samler ikke kun hukommelse på egen hånd. Der skal først være en ny hukommelsesallokeringsanmodning. Hvis systemet har en lav mængde tilgængelig hukommelse, vil GC-optimeringsmotoren komme i spil.
Java GC
I Java administrerer en GC også tildelingen og deallokeringen af hukommelsesadresser. Java har dog i øjeblikket fire forskellige typer understøttede affaldsopsamlere:
- Garbage-First (G1)
- Seriel
- Parallel
- Z Garbage Collector (ZGC)
G1 garbage collector er Javas standard GC siden udgivelsen af Java Development Kit (JDK) 9. Java organiserer data i objekter og gemmer disse objekter i en hobe af fast størrelse. G1 skraldeopsamleren opdeler dyngen i lige store dyngeområder. Den delte derefter disse bunkeområder i to sektioner; unge og gamle generationer.
Hver gang du opretter et nyt objekt, sker der pladsallokering til dette objekt i den unge generation. Ved hjælp af en ældningsproces kopierer G1-affaldssamleren genstande i de unge regioner til de gamle regioner. Den kopierer også objekter, der allerede er i den gamle region, til en ældre region.
G1-affaldssamleren udfører derefter det meste af sin hukommelsesfordeling i den unge generation, og begiver sig lejlighedsvis til den gamle generations sektion.
Hvad er fordelene ved at have en skraldeopsamler?
Fordelen ved at have en skraldeopsamler er, at det forhindrer dig i at tænke på hukommelseshåndtering, mens du skriver din kode. Dette giver dig tid til at fokusere på de andre vigtige aspekter af din ansøgning. Flere andre fordele er dog værd at fremhæve.
Genvinding af ubrugte objekter og frigørelse af hukommelse giver renere applikationsudførelse. Hvis dit program frigør hukommelse så hurtigt som muligt, vil det have et mindre hukommelsesfodaftryk og kan køre mere effektivt.
Skraldopsamling reducerer fejl relateret til hukommelseshåndtering såsom lækager og pointerfejl. Dette skyldes, at processen ikke længere er afhængig af programmøren og deres evne til at skrive nøjagtig kode.