Sobes.tech
Junior

Was ist der Garbage Collector in C#?

sobes.tech KI

Antwort von AI

Der Garbage Collector in C# ist Teil der .NET-Laufzeitumgebung (CLR), die den Speicher automatisch verwaltet, indem sie Ressourcen freigibt, die von nicht mehr zugänglichen Objekten belegt werden.

Funktionsprinzipien:

  • Objektüberwachung: Der Garbage Collector überwacht die im verwalteten Heap erstellten Objekte.
  • Erreichbarkeitsbestimmung: Er bestimmt, welche Objekte erreichbar für den laufenden Code sind (d.h. auf die gültige Referenzen zeigen).
  • Sammlung nicht erreichbarer Objekte: Objekte, die nicht mehr erreichbar sind, gelten als "Müll" und können sicher entfernt werden.

Der Sammelprozess umfasst:

  1. Markierung (Marking). Der GC scannt den Stack und die Register, um die Wurzeln (Wurzelobjekte) zu finden. Von den Wurzeln aus durchläuft er den Objektdiagramm und markiert erreichbare Objekte.
  2. Kompaktierung (Compacting). Reduziert die Fragmentierung des Speichers. Der GC verschiebt erreichbare Objekte in einen zusammenhängenden Speicherblock, um freien Raum zu hinterlassen.
  3. Aufräumen (Sweeping). Nicht erreichbare Objekte (nicht markiert) werden entfernt und ihr Speicher freigegeben.

Hauptmerkmale:

  • Automatische Verwaltung: Entfernt die manuelle Verantwortung des Entwicklers für die Speicherfreigabe.
  • Generationen: Der Heap ist in Generationen (Gen 0, Gen 1, Gen 2) unterteilt. Dies optimiert die Sammlung, da die meisten Objekte schnell Müll werden. Neue Objekte werden in Gen 0 erstellt. Wenn ein Objekt die Sammlung in Gen 0 überlebt, wird es in Gen 1 verschoben, usw.
  • Finalizer und Freigabe (Finalizers and Disposal): Der GC garantiert nicht die sofortige Ausführung von Finalizern für Objekte, die IDisposable implementieren. Für die Freigabe unmanaged Ressourcen sollte man einen expliziten Mechanismus verwenden (Dispose(), using-Anweisung).
// Beispiel für die Verwendung der using-Anweisung zur expliziten Freigabe von Ressourcen
using (var stream = new System.IO.FileStream("temp.txt", System.IO.FileMode.Create))
{
    // Mit der Datei arbeiten
} // stream.Dispose() wird automatisch aufgerufen