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:
- 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.
- Compactie (Compacting). Vermindert de fragmentatie van het geheugen. De GC verplaatst bereikbare objecten naar een aaneengesloten geheugenblok, waardoor vrije ruimte ontstaat.
- 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
IDisposableimplementeren. Voor het vrijmaken van niet-beheerde bronnen moet een expliciet mechanisme worden gebruikt (Dispose(),usingstatement).
// 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