Sobes.tech
Middle

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

sobes.tech AI

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

Ο συλλέκτης απορριμμάτων (GC) διαχειρίζεται αυτόματα τη μνήμη, απελευθερώνοντάς την από αντικείμενα που δεν χρησιμοποιούνται πλέον από το πρόγραμμα. Λειτουργεί σε αυτόματο mode, εξαλείφοντας την ανάγκη για χειροκίνητη διαχείριση της κατανομής και απελευθέρωσης μνήμης, μειώνοντας τον κίνδυνο διαρροών μνήμης και σφαλμάτων που σχετίζονται με δείκτες.

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

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

Ο GC στο .NET είναι γενεαλογικός. Η μνήμη διαιρείται σε γενεές:

  • Γενεά 0 (Gen 0): Περιέχει αντικείμενα μικρής διάρκειας. Η συλλογή αυτής της γενεάς συμβαίνει συχνότερα.
  • Γενεά 1 (Gen 1): Είναι ένας buffer για αντικείμενα που επέζησαν από τη συλλογή της Gen 0. Συλλέγεται λιγότερο συχνά από τη Gen 0.
  • Γενεά 2 (Gen 2): Περιέχει μακροχρόνια αντικείμενα. Συλλέγεται σπανιότερα και απαιτεί μεγαλύτερη απόδοση.

Τα αντικείμενα μετακινούνται μεταξύ των γενεών ανάλογα με το "επιβίωσή" τους στις συλλογές απορριμμάτων.

Για παράδειγμα, η δημιουργία και η χρήση ενός αντικειμένου:

// Δημιουργία αντικειμένου
MyObject obj = new MyObject();
// Χρήση του αντικειμένου
obj.DoSomething();
// Το αντικείμενο δεν χρησιμοποιείται πλέον, ο GC μπορεί να το συλλέξει
obj = null;

Η αναγκαστική κλήση συλλογής απορριμμάτων μπορεί να γίνει με GC.Collect(), αλλά γενικά δεν συνιστάται, καθώς ο GC βελτιστοποιεί αυτόματα τον χρόνο των συλλογών.

// Αναγκαστική εκτέλεση συλλογής απορριμμάτων (δεν συνιστάται σε πολλές περιπτώσεις)
GC.Collect();
GC.WaitForPendingFinalizers(); // Αναμονή για τους τελειωτές