En guide til affaldsindsamling i programmering

Hvad er affaldssamling?

Generelt lægmandssæt er Garbage collection (GC) intet andet end at indsamle eller få hukommelse tilbage, som er allokeret til objekter, men som ikke i øjeblikket er i brug i nogen del af vores program.

Lad os komme nærmere ind. Affaldssamling er den proces, hvor programmer forsøger at frigøre hukommelsesplads, der ikke længere bruges af objekter.

Affaldssamling implementeres forskelligt for hvert sprog. De fleste programmeringssprog på højt niveau har en slags skraldesamling indbygget. Programmeringssprog på lavt niveau kan tilføje skraldindsamling gennem biblioteker.

Som sagt ovenfor har hvert programmeringssprog deres egen måde at udføre GC på. I C-programmering skal udviklere tage sig af hukommelsestildeling og deallocation ved hjælp af malloc () og dealloc () -funktioner. Men i tilfælde af C # behøver udviklere ikke tage sig af GC, og det anbefales heller ikke.

Hvordan sker allokering af hukommelse?

I C # sker hukommelsestildeling af objekter i en administreret bunke, som er taget hånd om af CLR (fælles sprogkørselstid). Hukommelsesallokering til bunken sker gennem win32 dll i OS og på lignende måde i C.

Men i C placeres objekter i hukommelsen, uanset hvor der er ledig plads, der passer til objektets størrelse. Hukommelseskortlægning fungerer også baseret på Linkedlist-koncepter. I C # sker hukommelsesallokering for bunken lineært, den ene efter den anden.

Hver gang der oprettes et nyt objekt, tildeles hukommelse i bunken, og markøren flyttes til den næste hukommelsesadresse. Hukommelsestildeling i C # er hurtigere end i C. Dette skyldes, at hukommelsen i C skal søge og allokere efter objektet. Så det tager lidt mere tid end C #.

Generationer i C # GC

I .net-programmering har bunken tre generationer kaldet generationer 0, 1 og 2. Generation 0 bliver fyldt først, hver gang et nyt objekt oprettes. Derefter kører affaldssamleren, når Generation 0 bliver fyldt. Nyoprettede objekter placeres i generation 0.

Når du udfører affaldsindsamling, ødelægges alle de uønskede genstande, og så bliver hukommelsen frigjort og komprimeret. GC sørger for at pege henvisningerne til frigivet hukommelse, når GC sker.

Generation 1 og 2 indeholder objekter, der har længere levetid. GC i generation 1 og 2 vil ikke ske, før generation 0 har tilstrækkelig hukommelse til at allokere.

Du bør ikke påberåbe GC programmatisk. Det er godt at lade det ske alene. GC får opkald, når generation 0 bliver fyldt.

Fordele og ulemper ved GC

Affaldssamling er et værktøj, der sparer tid for programmører. For eksempel erstatter det behovet for funktioner som malloc () og free (), som findes i C. Det kan også hjælpe med at forhindre hukommelseslækage.

Ulempen ved affaldsindsamling er, at det har en negativ indvirkning på ydeevnen. GC skal løbende køre gennem programmet, kontrollere objektreferencer og rense hukommelsen. Dette tager ressourcer op og kræver ofte, at programmet stopper.

Hvornår skal man gøre det?

Hvis et objekt ikke har nogen referencer (ikke længere kan nås), er det berettiget til affaldsindsamling.

For eksempel i Java-koden nedenfor har Thing-objektet, der oprindeligt henvises til med 'thing1', sin eneste henvisning omdirigeret til et andet objekt på bunken. Dette betyder, at det derefter ikke kan nås og vil få hukommelsen tildelt af skraldopsamleren.

class Useless { public static void main (String[] args) { Thing thing1 = new Thing(); Thing thing2 = new Thing(); thing2 = thing1; // direct thing2's reference towards thing1 // no references access thing2 } }

Et eksempel på affaldsindsamling er ARC, en forkortelse for automatisk referencetælling. Dette bruges for eksempel i Swift. ARC koger ned til at holde styr på referencerne til alle objekter, der oprettes. Hvis antallet af referencer falder til 0, markeres objektet til deallocation.

Mere information:

  • //docs.microsoft.com/en-us/dotnet/standard/garbage-collection/fundamentals - At vide mere om affaldsindsamling