Sobes.tech
Junior

Wat is de Garbage Collector in C#?

sobes.tech AI

Antwoord van AI

De garbage collector in C# maakt deel uit van de .NET-runtimeomgeving (CLR), die automatisch het geheugen beheert door bronnen vrij te maken die worden gebruikt door niet-meer-toegankelijke objecten.

Werking principes:

  • Objecttracking: De garbage collector volgt de objecten die zijn gemaakt in de beheerde heap.
  • Bepaling van bereikbaarheid: Het bepaalt welke objecten bereikbaar zijn voor de lopende code (d.w.z. dat ze geldige referenties hebben).
  • Verzameling van niet-bereikbare objecten: Objecten die niet meer bereikbaar zijn, worden als "rommel" beschouwd en kunnen veilig worden verwijderd.

Het verzamelingsproces omvat:

  1. Markering (Marking). De GC scant de stack en registers om de roots (wortelobjecten) te vinden. Vanaf de roots doorloopt hij de objectgrafen en markeert hij bereikbare objecten.
  2. Compactie (Compacting). Vermindert de fragmentatie van het geheugen. De GC verplaatst bereikbare objecten naar een aaneengesloten geheugenblok, waardoor vrije ruimte ontstaat.
  3. Schoonmaak (Sweeping). Niet-bereikbare objecten (niet gemarkeerd) worden verwijderd en hun geheugen wordt vrijgemaakt.

Belangrijkste kenmerken:

  • Automatisch beheer: Verwijdert de handmatige verantwoordelijkheid van de ontwikkelaar voor het vrijmaken van geheugen.
  • Generaties: De heap is verdeeld in generaties (Gen 0, Gen 1, Gen 2). Dit optimaliseert de verzameling, omdat de meeste objecten snel rommel worden. Nieuwe objecten worden in Gen 0 gemaakt. Als een object de verzameling in Gen 0 overleeft, wordt het verplaatst naar Gen 1, enzovoort.
  • Finalizers en disposal: De GC garandeert niet de onmiddellijke uitvoering van finalizers voor objecten die IDisposable implementeren. Voor het vrijmaken van niet-beheerde bronnen moet een expliciet mechanisme worden gebruikt (Dispose(), using statement).
// Voorbeeld van het gebruik van de using-statement voor expliciete resourcevrijgave
using (var stream = new System.IO.FileStream("temp.txt", System.IO.FileMode.Create))
{
    // Werken met het bestand
} // stream.Dispose() wordt automatisch aangeroepen