Sobes.tech
Junior

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

sobes.tech AI

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

Ο garbage collector στη C# είναι μια αυτοματοποιημένη διαδικασία διαχείρισης μνήμης. Απελευθερώνει τη μνήμη που καταλαμβάνεται από αντικείμενα που δεν χρησιμοποιούνται πλέον από την εφαρμογή.

Βασικά σημεία:

  • Αυτόματη διαχείριση: Ο προγραμματιστής δεν χρειάζεται να δεσμεύει ή να απελευθερώνει χειροκίνητα μνήμη για τα περισσότερα αντικείμενα. Το CLR (Common Language Runtime) το κάνει αυτόματα.
  • Παρακολούθηση αναφορών: Ο garbage collector καθορίζει ποια αντικείμενα είναι προσβάσιμα από τις ρίζες (π.χ., στοίβες νημάτων, στατικά πεδία). Τα αντικείμενα χωρίς αναφορές από αυτές τις πηγές θεωρούνται μη προσβάσιμα και συλλέγονται.
  • Γενιές: Ο heap χωρίζεται σε γενιές (0, 1 και 2). Τα αντικείμενα που "επιβιώνουν" μετά τη συλλογή μετακινούνται σε ανώτερες γενιές. Αυτό βελτιστοποιεί τη διαδικασία, καθώς τα περισσότερα αντικείμενα έχουν σύντομη ζωή.
  • Τελειοποίηση: Τα αντικείμενα μπορούν να έχουν μια μέθοδο Finalize, που καλείται από τον garbage collector πριν απελευθερώσει τη μνήμη. Χρησιμοποιείται για τον καθαρισμό μη διαχειριζόμενων πόρων, αλλά η χρήση της περιορίζεται λόγω απρόβλεπτου χρόνου εκτέλεσης.
  • Συμπαγής: Μετά τη συλλογή, ο garbage collector μπορεί να μετακινεί τα επιζώντα αντικείμενα για να μειώσει τον κατακερματισμό της μνήμης.
// Παράδειγμα δημιουργίας αντικειμένου στη διαχειριζόμενη στοίβα
MyClass obj = new MyClass();
// Όταν δεν υπάρχουν πλέον αναφορές στο obj, ο garbage collector μπορεί να ελευθερώσει τη μνήμη

// Παράδειγμα χειροκίνητης απελευθέρωσης μη διαχειριζόμενων πόρων με IDisposable και using
// Συνιστώμενη προσέγγιση αντί για Finalize
using (var resource = new UnmanagedResourceWrapper())
{
    // Χρήση του πόρου
} // Εδώ καλείται το resource.Dispose(), καθαρίζοντας τον μη διαχειριζόμενο πόρο