Sobes.tech
Junior

Τι είναι ο συλλέκτης απορριμμάτων (Garbage Collector) στη C#;

sobes.tech AI

Απάντηση από AI

Ο συλλέκτης απορριμμάτων στη C# αποτελεί μέρος του περιβάλλοντος εκτέλεσης .NET (CLR), το οποίο διαχειρίζεται αυτόματα τη μνήμη απελευθερώνοντας πόρους που καταλαμβάνονται από αντικείμενα που πλέον δεν είναι προσβάσιμα.

Αρχές λειτουργίας:

  • Παρακολούθηση αντικειμένων: Ο συλλέκτης απορριμμάτων παρακολουθεί τα αντικείμενα που δημιουργούνται στη διαχειριζόμενη στοίβα.
  • Καθορισμός προσβασιμότητας: Καθορίζει ποια αντικείμενα είναι προσβάσιμα από τον τρέχοντα κώδικα (δηλαδή, έχουν έγκυρες αναφορές).
  • Συλλογή μη προσβάσιμων αντικειμένων: Τα αντικείμενα που δεν είναι πλέον προσβάσιμα θεωρούνται "σκουπίδια" και μπορούν να διαγραφούν με ασφάλεια.

Η διαδικασία συλλογής περιλαμβάνει:

  1. Σήμανση (Marking). Ο GC σαρώσει τη στοίβα και τις καταχωρίσεις για να βρει τις ρίζες (ριζικά αντικείμενα). Από τις ρίζες, διασχίζει το γράφο αντικειμένων και σημαδεύει τα προσβάσιμα.
  2. Συμπίεση (Compacting). Μειώνει τον κατακερματισμό της μνήμης. Ο GC μετακινεί τα προσβάσιμα αντικείμενα σε μια συνεχόμενη περιοχή μνήμης, αφήνοντας ελεύθερο χώρο.
  3. Καθαρισμός (Sweeping). Τα μη προσβάσιμα αντικείμενα (μη σημαδεμένα) διαγράφονται και η μνήμη τους ελευθερώνεται.

Κύρια χαρακτηριστικά:

  • Αυτόματη διαχείριση: Αφαιρεί την χειροκίνητη ευθύνη του προγραμματιστή για την απελευθέρωση μνήμης.
  • Γενιές: Ο σωρός διαιρείται σε γενιές (Gen 0, Gen 1, Gen 2). Αυτό βελτιστοποιεί τη συλλογή, καθώς τα περισσότερα αντικείμενα γίνονται γρήγορα σκουπίδια. Τα νέα αντικείμενα δημιουργούνται στη Gen 0. Αν ένα αντικείμενο επιβιώσει από τη συλλογή στη Gen 0, μετακινείται στη Gen 1 και ούτω καθεξής.
  • Τελικοποιητές και διαχείριση (Finalizers and Disposal): Ο GC δεν εγγυάται την άμεση εκτέλεση των τελικοποιητών για αντικείμενα που υλοποιούν το IDisposable. Για την απελευθέρωση μη διαχειριζόμενων πόρων, πρέπει να χρησιμοποιείται ένας ρητός μηχανισμός (Dispose(), δήλωση using).
// Παράδειγμα χρήσης της δήλωσης using για ρητή απελευθέρωση πόρων
using (var stream = new System.IO.FileStream("temp.txt", System.IO.FileMode.Create))
{
    // Εργασία με το αρχείο
} // Το stream.Dispose() θα κληθεί αυτόματα