Een garbage collector (GC) is een geheugenbeheerder. Veel programmeertalen hebben een ingebouwde GC. Deze functie wijst automatisch het geheugen in een programma toe en maakt de toewijzing ongedaan. Het maakt vastgebonden, ongebruikt geheugen vrij dat uw toepassing vertraagt.

Het mooie van een GC is dat het namens u geheugen vrijgeeft, zonder dat u iets hoeft te doen. Je zou het daarom als zo'n essentiële functie kunnen beschouwen dat je zou verwachten dat elke programmeertaal het heeft. Helaas is dit niet het geval; zelfs een populaire taal als C kan een GC missen.

Hoe werkt geheugentoewijzing?

Wanneer u een programma in een programmeertaal uitvoert, reserveert uw besturingssysteem een gegevensstapel in het geheugen voor dat programma. Dit programma bezit en bezet deze datastack totdat de uitvoering is voltooid. Als uw programma meer geheugen nodig heeft dan beschikbaar is, kan het dynamisch meer geheugen uit de geheugenheap van het besturingssysteem toewijzen.

Bij het programmeren vertegenwoordigt een variabele een geheugenlocatie. Dus wanneer u een nieuwe variabele declareert, wijst de programmeertaal ruimte in het geheugen toe voor deze variabele. De variabele heeft nu een geheugenadres. Totdat u een waarde aan deze variabele toewijst, blijft deze niet geïnitialiseerd en kan deze een waarde bevatten.

Als je in een programmeertaal een variabele kunt declareren zonder deze te initialiseren, dan is het een dynamische variabele. Dit betekent dat de waarde die u aan de variabele toewijst in de loop van de tijd kan veranderen. De geheugenlocatie van de variabele blijft echter hetzelfde totdat u de toewijzing ervan ongedaan maakt.

Hoe werkt geheugendeallocatie?

Geheugentoewijzing is een soortgelijk proces voor alle programmeertalen. Maar de bijbehorende methode van geheugendeallocatie verschilt meestal. Er zijn twee soorten geheugendeallocatiemethoden; handmatig en automatisch. Een GC doet automatische deallocatie.

Geheugendeallocatie zonder een vuilnisman

De C programmeertaal gebruikt geen GC voor geheugendeallocatie. Daarom moeten C-programmeurs handmatig geheugen toewijzen en vrijgeven. C staat dynamische geheugentoewijzing toe voor wanneer u tijdens het compileren niet weet hoeveel geheugen u tijdens runtime zult gebruiken.

De standaardbibliotheek (stdlib.h) bevat de functies die C gebruikt om dynamische geheugentoewijzing te beheren. Deze functies omvatten:

  • malloc(): wijst een specifieke geheugengrootte toe en retourneert een aanwijzer naar dat geheugen. Als er onvoldoende geheugen beschikbaar is in de geheugenpool van het besturingssysteem, wordt null geretourneerd.
  • free(): maakt de toewijzing van een specifiek geheugenblok ongedaan en retourneert het naar de geheugenpool van het besturingssysteem.

C Programma voorbeeld

#erbij betrekken
#erbij betrekken

inthoofd()
{
int *ptr; // aanwijzer declareren
int j; // declareer teller

// wijs ruimte toe voor 200 gehele getallen
ptr = (int *) malloc(200 * De grootte van(int));

// voeg gehele waarden in het toegewezen geheugen in
// en print elke waarde naar de console
voor (j = 0; j < 200; j++)
{
ptr[j] = j;
printf("%d\t",ptr[j]);
}

// maak de toewijzing van het eerder toegewezen geheugen ongedaan
vrij(ptr);
opbrengst0;
}

De bovenstaande code wijst geheugen toe om 200 gehele waarden op te slaan met behulp van de mallok() functie. Het gebruikt een aanwijzer om toegang te krijgen tot deze geheugenlocatie en slaat er 200 integerwaarden in op. De aanwijzer drukt ook de gegevens die op de geheugenlocatie zijn opgeslagen af ​​naar de console. Ten slotte maakt het programma de toewijzing van het eerder toegewezen geheugen ongedaan met behulp van de vrij() functie.

Geheugenoverdracht met een vuilnisman

Verschillende populaire programmeertalen gebruiken een GC voor geheugenbeheer. Dit maakt het leven van programmeurs die deze talen gebruiken veel gemakkelijker. C# en Java zijn twee programmeertalen die een GC gebruiken.

De C# GC

In de C# programmeertaal, beheert een GC de toewijzing en vrijgave van geheugenadressen. Daarom hoeft een C#-programmeur zich geen zorgen te maken over het ongedaan maken van de toewijzing van een object nadat het zijn doel heeft bereikt.

De C# GC initialiseert een geheugenpool, de managed heap genaamd, voor elk nieuw proces (of programma). Het noemt de VirtualAlloc() functie om geheugen toe te wijzen en de VirtualFree() functie om de toewijzing ervan ongedaan te maken. Het beste is dat dit allemaal op de achtergrond gebeurt zonder dat u, de programmeur, er iets voor hoeft te doen.

De C# GC heeft een optimalisatie-engine die wordt gebruikt om te beslissen wanneer de toewijzing van geheugen ongedaan wordt gemaakt. De optimalisatie-engine onderzoekt de root van de applicatie om te bepalen welke objecten niet meer in gebruik zijn. Het doet dit door een grafiek te maken die zich uitstrekt van de hoofdmap van de toepassing tot verbonden objecten. Deze root bevat statische velden, lokale variabelen, enz. Elk object dat niet is verbonden met de hoofdmap van de toepassing, is afval.

De GC-optimalisatie-engine verzamelt niet alleen geheugen op zichzelf. Er moet eerst een nieuw geheugentoewijzingsverzoek zijn. Als het systeem weinig beschikbaar geheugen heeft, komt de GC-optimalisatie-engine in het spel.

De Java GC

In Java beheert een GC ook de toewijzing en vrijgave van geheugenadressen. Java heeft momenteel echter vier verschillende soorten ondersteunde afvalverzamelaars:

  • Garbage-First (G1)
  • serieel
  • Parallel
  • Z Vuilnisophaler (ZGC)

De G1 garbage collector is de standaard GC van Java sinds de release van de Java Development Kit (JDK) 9. Java organiseert gegevens in objecten en slaat deze objecten op in een heap van vaste grootte. De G1-vuilniscollector verdeelt de heap in heapgebieden van gelijke grootte. Vervolgens splitste het deze heapgebieden in twee secties; jonge en oude generaties.

Elke keer dat u een nieuw object maakt, gebeurt de ruimtetoewijzing voor dit object in de jonge generatie. Door middel van een verouderingsproces kopieert de G1 garbage collector objecten in de jonge regio's naar de oude regio's. Het kopieert ook objecten die zich al in de oude regio bevinden naar een oudere regio.

De G1-afvalverzamelaar voert dan het grootste deel van zijn geheugendeallocatie uit bij de jonge generatie, en waagt zich af en toe aan de sectie van de oude generatie.

Wat zijn de voordelen van een afvalophaler?

Het voordeel van het hebben van een garbage collector is dat het u verhindert na te denken over geheugenbeheer tijdens het schrijven van uw code. Dit geeft u de tijd om u te concentreren op de andere belangrijke aspecten van uw aanvraag. Er zijn echter nog een aantal andere voordelen die het vermelden waard zijn.

Het terugwinnen van ongebruikte objecten en het vrijmaken van geheugen zorgt voor een schonere uitvoering van toepassingen. Als uw programma zo snel mogelijk geheugen vrijmaakt, heeft het een kleinere geheugenvoetafdruk en kan het efficiënter werken.

Garbage collection vermindert fouten met betrekking tot geheugenbeheer, zoals lekken en aanwijzerfouten. Dit komt omdat het proces niet langer afhankelijk is van de programmeur en hun vermogen om nauwkeurige code te schrijven.