Middle
Αναφέρετε τις μεθόδους συλλογής απορριμμάτων (Garbage Collector).
sobes.tech AI
Απάντηση από AI
Μέθοδοι συλλογής απορριμμάτων:
- Αριθμητική αναφοράς (Reference Counting): Κάθε αντικείμενο διατηρεί έναν μετρητή αναφορών. Όταν ο μετρητής φτάσει το μηδέν, το αντικείμενο θεωρείται απορρίμματα και διαγράφεται.
- Πλεονεκτήματα: Απλό, δεν μπλοκάρει την κύρια εκτέλεση για μεγάλο χρονικό διάστημα.
- Μειονεκτήματα: Δεν διαχειρίζεται κυκλικές αναφορές· απαιτεί επιπλέον χώρο για τον μετρητή σε κάθε αντικείμενο.
- Ανιχνευτές απορριμμάτων (Tracing Garbage Collectors): Ξεκινάνε με ένα σύνολο "ρίζων" αντικειμένων (π.χ., ενεργές μεταβλητές, σωρός κλήσεων) και διατρέχουν αναδρομικά όλα τα αντικείμενα προσβάσιμα από αυτές τις ρίζες. Τα μη προσβάσιμα αντικείμενα θεωρούνται απορρίμματα.
- Κύριες στρατηγικές ανίχνευσης:
- Σήμανση και σκούπισμα (Mark and Sweep):
- Σήμανση (Mark): Περνάει το γράφο των αντικειμένων, σημαδεύοντας όλα τα προσβάσιμα αντικείμενα.
- Σκούπισμα (Sweep): Δεύτερη διέλευση στη μνήμη, διαγράφοντας όλα τα μη σημαδεμένα αντικείμενα.
- Μειονεκτήματα: Κατακερματισμός μνήμης.
- Σήμανση και συμπίεση (Mark and Compact):
- Σήμανση (Mark): Όπως στο Mark and Sweep.
- Συμπίεση (Compact): Μετακινεί τα ζωντανά αντικείμενα ώστε να βρίσκονται συνεχόμενα, εξαλείφοντας τον κατακερματισμό.
- Μειονεκτήματα: Πιο πολύπλοκο, μπορεί να απαιτεί διακοπή της εκτέλεσης.
- Αντιγραφή (Copying): Διαχωρίζει τη μνήμη σε δύο περιοχές (ημιδεσμούς). Σε κάθε συλλογή απορριμμάτων, τα ζωντανά αντικείμενα από μια περιοχή αντιγράφονται σε μια άλλη. Στη συνέχεια, η παλιά περιοχή καθαρίζεται πλήρως.
- Πλεονεκτήματα: Χωρίς κατακερματισμό, γρήγορη κατανομή μνήμης μετά τη συλλογή.
- Μειονεκτήματα: Απαιτεί διπλάσια μνήμη από αυτή που χρησιμοποιείται ενεργά.
- Σήμανση και σκούπισμα (Mark and Sweep):
- Κύριες στρατηγικές ανίχνευσης:
- Γενεακή συλλογή απορριμμάτων (Generational Garbage Collection): Βασίζεται στην υπόθεση ότι τα περισσότερα αντικείμενα δεν ζουν πολύ. Η μνήμη διαιρείται σε γενιές (νεαρή, παλιά). Τα αντικείμενα τοποθετούνται στη νεαρή γενιά κατά τη δημιουργία. Αν ένα αντικείμενο επιβιώσει από αρκετές συλλογές στη νεαρή γενιά, μεταφέρεται στην παλιά. Οι συλλογές στη νεαρή γενιά γίνονται συχνότερα.
- Πλεονεκτήματα: Αποτελεσματικό, καθώς το μεγαλύτερο μέρος της εργασίας γίνεται στη νεαρή γενιά με μικρά δεδομένα.
- Μειονεκτήματα: Απαιτεί παρακολούθηση των αναφορών από τις παλιές γενιές στις νεαρές (καρτέλες εγγραφής ή άλλα μηχανισμοί).
Παραδείγματα γλωσσών και GC:
- Python: Αναφορά μετρώντας (με κυκλική συλλογή για κυκλικές αναφορές).
- Java, C#: Γενεακή, Mark and Sweep, Mark and Compact, Copying (διάφορες επιλογές και συνδυασμοί ανάλογα με την έκδοση και τις ρυθμίσεις JVM/.NET).
- Go: Συγχρονισμένο, μη γενεακό, Mark and Sweep με βελτιστοποιήσεις.