(Translated by https://www.hiragana.jp/)
Συλλογή απορριμμάτων (υπολογιστές) - Βικιπαίδεια

Συλλογή απορριμμάτων (υπολογιστές)

(Ανακατεύθυνση από Συλλέκτης απορριμμάτων)

Σしぐまτたうηいーたνにゅー πληροφορική, ηいーた συλλογή απορριμμάτων (αあるふぁγがんまγがんまλらむだ. garbage collection ή GC) είναι μみゅーιいおたαあるふぁ μορφή αυτόματης διαχείρισης μνήμης ηいーた οποία λειτουργεί σしぐまτたうοおみくろん υπόβαθρο, κατά τたうηいーたνにゅー εκτέλεση ενός προγράμματος. Οおみくろん συλλέκτης απορριμμάτων (garbage collector), ηいーた απλώς συλλέκτης, είναι συνήθως ένα νήμα τたうοおみくろんυうぷしろん συστήματος (πぱい.χかい. τたうοおみくろんυうぷしろん λειτουργικού συστήματος ή μιας εικονικής μηχανής επί της οποίας εκτελείται τたうοおみくろん βασικό πρόγραμμα) σχεδιασμένο κάθε φορά πぱいοおみくろんυうぷしろん ενεργοποιείται νにゅーαあるふぁ απελευθερώνει τたうαあるふぁ τρέχοντα απορρίμματα: τたうηいーた μνήμη τたうηいーたνにゅー οποία καταναλώνουν τたうαあるふぁ αντικείμενα πぱいοおみくろんυうぷしろん τたうοおみくろん πρόγραμμα δでるたεいぷしろんνにゅー χρησιμοποιεί πぱいιいおたαあるふぁ. Ηいーた συλλογή απορριμμάτων εφευρέθηκε από τたうοおみくろんνにゅー Τたうζぜーたοおみくろんνにゅー Μακάρθι τたうοおみくろん 1959 για νにゅーαあるふぁ λύσει προβλήματα της γλώσσας προγραμματισμού Lisp.[1][2]

Ηいーた συλλογή απορριμμάτων συχνά εμφανίζεται σしぐまαあるふぁνにゅー τたうοおみくろん αντίθετο της χειροκίνητης διαχείρισης μνήμης, ηいーた οποία απαιτεί από τたうοおみくろんνにゅー προγραμματιστή νにゅーαあるふぁ ορίζει πぱいοおみくろんιいおたαあるふぁ αντικείμενα μπορούν νにゅーαあるふぁ απομακρυνθούν από τたうηいーた μνήμη. Πολλά συστήματα όμως συνδυάζουν τις δύο προσεγγίσεις, μαζί μみゅーεいぷしろん άλλες τεχνικές όπως ηいーた δέσμευση μνήμης σしぐまτたうηいーた στοίβα κかっぱαあるふぁιいおた ηいーた εξαγωγή περιοχών (region inference).

Περιορισμένοι πόροι εκτός της μνήμης, όπως πぱい.χかい. οおみくろんιいおた δικτυακές υποδοχές, τたうαあるふぁ χειριστήρια βάσεων δεδομένων (database handles), τたうαあるふぁ παράθυρα γがんまιいおたαあるふぁ αλληλεπίδραση μみゅーεいぷしろん τたうοおみくろんνにゅー χρήστη κかっぱαあるふぁιいおた οおみくろんιいおた περιγραφείς αρχείων κかっぱαあるふぁιいおた συσκευών, δでるたεいぷしろんνにゅー επηρεάζονται από τたうηいーた συλλογή απορριμμάτων. Υπάρχουν άλλες μέθοδοι γがんまιいおたαあるふぁ τたうηいーた διαχείριση αυτών τたうωおめがνにゅー πόρων, όπως οおみくろんιいおた καταστροφείς, πぱいοおみくろんυうぷしろん μπορούν νにゅーαあるふぁ διαχειριστούν ακόμα κかっぱαあるふぁιいおた τたうηいーた μνήμη, μみゅーεいぷしろん αποτέλεσμα νにゅーαあるふぁ μみゅーηいーたνにゅー χρειάζεται συλλογή απορριμμάτων. Κάποια συστήματα συλλογής απορριμμάτων επιτρέπουν σしぐまεいぷしろん αυτούς τους άλλους πόρους νにゅーαあるふぁ σχετίζονται μみゅーεいぷしろん μみゅーιいおたαあるふぁ περιοχή σしぐまτたうηいーた μνήμη, ηいーた οποία, όταν συλλεχθεί, νにゅーαあるふぁ προκαλέσει τたうηいーたνにゅー αποδέσμευση τたうωおめがνにゅー πόρων, κάτι πぱいοおみくろんυうぷしろん ονομάζεται οριστικοποίηση (finalization). Αυτό όμως μπορεί νにゅーαあるふぁ προκαλέσει περιπλοκές, όπως οおみくろんιいおた σημαντικές καθυστερήσεις μεταξύ της παύσης της χρήσης κかっぱαあるふぁιいおた της αποδέσμευσης σημαντικά περιορισμένων πόρων, ή ηいーた έλλειψη ελέγχου σχετικά μみゅーεいぷしろん τたうοおみくろん πぱいοおみくろんιいおたοおみくろん νήμα θしーたαあるふぁ κάνει τたうηいーたνにゅー αποδέσμευση.

Οおみくろんιいおた βασικές αρχές της συλλογής απορριμμάτων είναι:

  1. Βρες τたうαあるふぁ δεδομένα τたうοおみくろんυうぷしろん προγράμματος πぱいοおみくろんυうぷしろん δでるたεいぷしろんνにゅー πρόκειται νにゅーαあるふぁ προσπελαστούν σしぐまτたうοおみくろん μέλλον
  2. Αποδέσμευσε τους πόρους πぱいοおみくろんυうぷしろん χρειάζονταν από τたうαあるふぁ αντικείμενα

Πολλές γλώσσες προγραμματισμού χρειάζονται συλλογή απορριμμάτων, είτε σしぐまαあるふぁνにゅー μέρος τたうοおみくろんυうぷしろん ορισμού της γλώσσας (γがんまιいおたαあるふぁ παράδειγμα ηいーた Java, ηいーた C# κかっぱαあるふぁιいおた οおみくろんιいおた περισσότερες γλώσσες σεναρίων) είτε σしぐまτたうηいーたνにゅー πράξη σしぐまαあるふぁνにゅー μέρος μιας ρεαλιστικής υλοποίησης (γがんまιいおたαあるふぁ παράδειγμα σしぐまεいぷしろん τυπικές γλώσσες όπως οおみくろん λらむだ-λογισμός) – αυτές ονομάζονται γλώσσες μみゅーεいぷしろん συλλογή απορριμμάτων (garbage collected languages). Άλλες γλώσσες έχουν σχεδιαστεί γがんまιいおたαあるふぁ χρήση μみゅーεいぷしろん χειροκίνητη διαχείριση μνήμης αλλά υπάρχουν κかっぱαあるふぁιいおた υλοποιήσεις μみゅーεいぷしろん συλλογή απορριμμάτων γがんまιいおたαあるふぁ αυτές (όπως γがんまιいおたαあるふぁ τたうηいーた C ή τたうηいーた C++). Κάποιες γλώσσες, όπως ηいーた Ada, ηいーた Modula-3 κかっぱαあるふぁιいおた ηいーた C++/CLI επιτρέπουν κかっぱαあるふぁιいおた συλλογή απορριμμάτων κかっぱαあるふぁιいおた χειροκίνητη διαχείριση μνήμης σしぐまτたうηいーたνにゅー ίδια εφαρμογή, χρησιμοποιώντας διαφορετικούς σωρούς (heaps) γがんまιいおたαあるふぁ αντικείμενα πぱいοおみくろんυうぷしろん είτε αποδεσμεύονται αυτόματα, είτε ηいーた διαχείρισή τους γίνεται χειροκίνητα - άλλες, όπως ηいーた D, έχουν συλλογή απορριμμάτων αλλά επιτρέπουν σしぐまτたうοおみくろんνにゅー χρήστη νにゅーαあるふぁ διαγράψει χειροκίνητα ένα αντικείμενο κかっぱαあるふぁιいおた νにゅーαあるふぁ απενεργοποιήσει εντελώς τたうηいーた συλλογή απορριμμάτων, όταν χρειάζεται περισσότερη ταχύτητα. Αあるふぁνにゅー κかっぱαあるふぁιいおた ηいーた ενσωμάτωση της συλλογής απορριμμάτων σしぐまτたうοおみくろんνにゅー μεταγλωττιστή κかっぱαあるふぁιいおた σしぐまτたうοおみくろん σύστημα χρόνου εκτέλεσης (run time system ή runtime) δίνει περισσότερες επιλογές, υπάρχουν συστήματα συλλογής απορριμμάτων τύπου post hoc, μみゅーεいぷしろん κάποια από αυτά νにゅーαあるふぁ μみゅーηいーたνにゅー χρειάζονται επανάληψη της μεταγλώττισης. (Ηいーた Post-hoc συλλογή απορριμμάτων συνήθως ονομάζεται litter collection.) Οおみくろん συλλέκτης απορριμμάτων σχεδόν είναι στενά συνδεδεμένος μみゅーεいぷしろん τたうοおみくろん σύστημα δέσμευσης μνήμης.

Πλεονεκτήματα

Επεξεργασία

Ηいーた συλλογή απορριμμάτων απαλλάσσει τたうοおみくろんνにゅー προγραμματιστή από τたうοおみくろん νにゅーαあるふぁ πρέπει νにゅーαあるふぁ αποδεσμεύει οおみくろん ίδιος τたうηいーた μνήμη. Αυτό έχει σしぐまαあるふぁνにゅー αποτέλεσμα κάποιες κατηγορίες σφαλμάτων νにゅーαあるふぁ αποκλείονται ή νにゅーαあるふぁ είναι πぱいιいおたοおみくろん δύσκολο νにゅーαあるふぁ εμφανιστούν:

  • Τたうαあるふぁ σφάλματα αιωρούμενου δείκτη (dangling pointer), πぱいοおみくろんυうぷしろん συμβαίνουν όταν μみゅーιいおたαあるふぁ θέση μνήμης αποδεσμεύεται αλλά εξακολουθούν νにゅーαあるふぁ υπάρχουν δείκτες πぱいοおみくろんυうぷしろん δείχνουν σしぐまεいぷしろん αυτήν κかっぱαあるふぁιいおた ένας από αυτούς τους δείκτες χρησιμοποιείται σしぐまτたうηいーた συνέχεια από τたうοおみくろんνにゅー κώδικα. Τότε όμως ηいーた μνήμη μπορεί νにゅーαあるふぁ έχει δεσμευτεί ξανά γがんまιいおたαあるふぁ άλλη χρήση κかっぱαあるふぁιいおた νにゅーαあるふぁ περιέχει άλλα δεδομένα, μみゅーεいぷしろん απροσδόκητα αποτελέσματα.
  • Τたうαあるふぁ σφάλματα διπλής αποδέσμευσης (double free bugs), πぱいοおみくろんυうぷしろん συμβαίνουν όταν ένα πρόγραμμα προσπαθεί νにゅーαあるふぁ αποδεσμεύσει μみゅーιいおたαあるふぁ περιοχή μνήμης πぱいοおみくろんυうぷしろん έχει ήδη αποδεσμευτεί (κかっぱαあるふぁιいおた πιθανόν νにゅーαあるふぁ έχει δεσμευτεί πάλι γがんまιいおたαあるふぁ άλλο σκοπό).
  • Κάποιες μορφές διαρροών μνήμης (memory leaks), στις οποίες ένα πρόγραμμα δでるたεいぷしろん μπορεί νにゅーαあるふぁ απελευθερώσει τたうηいーた μνήμη πぱいοおみくろんυうぷしろん καταλαμβάνουν αντικείμενα πぱいοおみくろんυうぷしろん δでるたεいぷしろんνにゅー είναι πぱいιいおたαあるふぁ ορατά από τたうοおみくろんνにゅー κώδικα, μみゅーεいぷしろん αποτέλεσμα, αあるふぁνにゅー αυτό συνεχιστεί, ηいーた μνήμη νにゅーαあるふぁ εξαντληθεί. (Ηいーた συλλογή απορριμμάτων συνήθως δでるたεいぷしろんνにゅー ασχολείται μみゅーεいぷしろん δεδομένα πぱいοおみくろんυうぷしろん είναι πολύ μεγάλα σしぐまεいぷしろん όγκο κかっぱαあるふぁιいおた τたうοおみくろん πρόγραμμα δでるたεいぷしろんνにゅー τたうαあるふぁ χρησιμοποιεί αλλά μπορεί νにゅーαあるふぁ τたうαあるふぁ δでるたεいぷしろんιいおた.)

Κάποια από τたうαあるふぁ σφάλματα πぱいοおみくろんυうぷしろん αντιμετωπίζει ηいーた συλλογή απορριμμάτων μπορούν επίσης νにゅーαあるふぁ οδηγούν κかっぱαあるふぁιいおた σしぐまεいぷしろん προβλήματα ασφάλειας.

Μειονεκτήματα

Επεξεργασία

Συνήθως ηいーた συλλογή απορριμμάτων έχει κάποια μειονεκτήματα:

  • Ηいーた συλλογή απορριμμάτων καταναλώνει υπολογιστικούς χώρους γがんまιいおたαあるふぁ νにゅーαあるふぁ αποφασίσει πぱいοおみくろんιいおたαあるふぁ μνήμη θしーたαあるふぁ αποδεσμεύσει, ανακαλύπτοντας πάλι πληροφορίες πぱいοおみくろんυうぷしろん μπορεί νにゅーαあるふぁ είναι γνωστές σしぐまτたうοおみくろんνにゅー προγραμματιστή. Αあるふぁνにゅー δでるたεいぷしろんνにゅー δοθεί οおみくろん χρόνος ζωής τたうωおめがνにゅー αντικειμένων από τたうοおみくろんνにゅー προγραμματιστή, τότε τたうοおみくろん κόστος είναι μみゅーιいおたαあるふぁ υπολογιστική επιβάρυνση (overhead), πぱいοおみくろんυうぷしろん μπορεί νにゅーαあるふぁ οδηγήσει σしぐまεいぷしろん αργή ταχύτητα εκτέλεσης. Ηいーた αλληλεπίδραση αυτής της επιβάρυνσης μみゅーεいぷしろん τたうηいーた μνήμη κかっぱαあるふぁιいおた τたうηいーたνにゅー ιεραρχική δομή αυτής, μπορεί νにゅーαあるふぁ οδηγήσει σしぐまεいぷしろん απαγορευτικές επιβαρύνσεις σしぐまεいぷしろん καταστάσεις πぱいοおみくろんυうぷしろん δでるたεいぷしろんνにゅー αναμένονται ή δでるたεいぷしろんνにゅー έχουν εντοπιστεί κατά τたうηいーた δοκιμή τたうοおみくろんυうぷしろん λογισμικού.
  • Ηいーた στιγμή πぱいοおみくろんυうぷしろん γίνεται ηいーた συλλογή απορριμμάτων μπορεί νにゅーαあるふぁ μみゅーηいーたνにゅー αναμένεται, μみゅーεいぷしろん αποτέλεσμα νにゅーαあるふぁ υπάρχουν καθυστερήσεις σしぐまεいぷしろん διάφορα χρονικά σημεία κατά τたうηいーたνにゅー εκτέλεση τたうοおみくろんυうぷしろん προγράμματος. Οおみくろんιいおた απρόβλεπτες καθυστερήσεις μπορεί νにゅーαあるふぁ είναι απαράδεκτες σしぐまεいぷしろん περιβάλλοντα εφαρμογών πραγματικού χρόνου (real-time), σしぐまτたうηいーたνにゅー επεξεργασία συναλλαγών ή σしぐまεいぷしろん προγράμματα πぱいοおみくろんυうぷしろん αλληλεπιδρούν μみゅーεいぷしろん τたうοおみくろんνにゅー χρήστη.
  • Οおみくろん προγραμματιστής δでるたεいぷしろん μπορεί νにゅーαあるふぁ χειρίζεται δείκτες (pointers), μόνο αναφορές (references).
  • Ηいーた μみゅーηいーた ντετερμινιστική συλλογή απορριμμάτων δでるたεいぷしろんνにゅー είναι συμβατή μみゅーεいぷしろん τたうηいーた διαχείριση τたうωおめがνにゅー πόρων πぱいοおみくろんυうぷしろん χρησιμοποιούνται κατά τたうοおみくろん προγραμματιστικό ιδίωμα RAII κかっぱαあるふぁιいおた δでるたεいぷしろんνにゅー συλλέγονται αυτόματα. Αυτό έχει ως αποτέλεσμα τたうαあるふぁ αντικείμενα πぱいοおみくろんυうぷしろん δでるたεいぷしろんνにゅー συλλέγονται αυτόματα νにゅーαあるふぁ επηρεάζουν τたうηいーたνにゅー αποδέσμευση τたうωおめがνにゅー αντικειμένων πぱいοおみくろんυうぷしろん διαχειρίζεται ηいーた συλλογή απορριμμάτων, όταν αντικείμενα τたうωおめがνにゅー δύο κατηγοριών συνδέονται μεταξύ τους.

Ανιχνευτική συλλογή απορριμμάτων

Επεξεργασία

Οおみくろんιいおた ανιχνευτικοί συλλέκτες απορριμμάτων (tracing garbage collectors) είναι οおみくろん συνηθέστερος τύπος συλλεκτών απορριμμάτων. Αρχικά εντοπίζουν τたうαあるふぁ αντικείμενα πぱいοおみくろんυうぷしろん είναι προσιτά (reachable) ή αυτά πぱいοおみくろんυうぷしろん θしーたαあるふぁ μπορούσαν νにゅーαあるふぁ είναι προσιτά, κかっぱαあるふぁιいおた σしぐまτたうηいーた συνέχεια αποδεσμεύουν όλα τたうαあるふぁ υπόλοιπα αντικείμενα.

Προσιτότητα ενός αντικειμένου

Επεξεργασία

Πρακτικά, ένα αντικείμενο είναι προσιτό αあるふぁνにゅー αναφέρεται σしぐまεいぷしろん αυτό τουλάχιστον μみゅーιいおたαあるふぁ μεταβλητή τたうοおみくろんυうぷしろん προγράμματος, είτε άμεσα, είτε μέσω αναφορών από άλλα προσιτά αντικείμενα. Ακριβέστερα, τたうαあるふぁ αντικείμενα μπορεί νにゅーαあるふぁ είναι προσιτά μみゅーεいぷしろん δύο μόνο τρόπους:

  1. Τたうαあるふぁ αντικείμενα ενός συγκεκριμένου συνόλου θεωρούνται προσιτά κかっぱαあるふぁιいおた ονομάζονται ρίζες (roots). Συνήθως είναι τたうαあるふぁ αντικείμενα σしぐまτたうαあるふぁ οποία υπάρχουν αναφορές οπουδήποτε σしぐまτたうηいーた στοίβα κλήσεων (δηλαδή όλες οおみくろんιいおた τυπικές μεταβλητές κかっぱαあるふぁιいおた οおみくろんιいおた παράμετροι τたうωおめがνにゅー συναρτήσεων πぱいοおみくろんυうぷしろん καλούνται), καθώς κかっぱαあるふぁιいおた όλες οおみくろんιいおた καθολικές (global) μεταβλητές.
  2. Κάθε αναφορά από ένα προσιτό αντικείμενο δείχνει κかっぱαあるふぁιいおた αυτή σしぐまεいぷしろん προσιτό αντικείμενο. Τυπικά, ηいーた προσιτότητα είναι μεταβατικό κλείσιμο (transitive closure).

Οおみくろん ορισμός της προσιτότητας τたうωおめがνにゅー απορριμμάτων δでるたεいぷしろんνにゅー είναι οおみくろん καλύτερος, γιατί ένα πρόγραμμα μπορεί νにゅーαあるふぁ χρησιμοποιήσει ένα αντικείμενο γがんまιいおたαあるふぁ τελευταία φορά κかっぱαあるふぁιいおた μετά νにゅーαあるふぁ μεσολαβήσει μεγάλο χρονικό διάστημα μέχρι τたうηいーたνにゅー αποδέσμευσή τたうοおみくろんυうぷしろん, επειδή δでるたεいぷしろんνにゅー είναι πぱいιいおたαあるふぁ ορατό σしぐまτたうοおみくろん τρέχον περιβάλλον τたうοおみくろんυうぷしろん προγράμματος. Κάποιες φορές γίνεται διάκριση μεταξύ τたうωおめがνにゅー συντακτικών απορριμμάτων (syntactic garbage), πぱいοおみくろんυうぷしろん είναι τたうαあるふぁ αντικείμενα πぱいοおみくろんυうぷしろん τたうοおみくろん πρόγραμμα δでるたεいぷしろん μπορεί νにゅーαあるふぁ δでるたεいぷしろんιいおた, κかっぱαあるふぁιいおた τたうωおめがνにゅー σημασιολογικών απορριμμάτων (semantic garbage), πぱいοおみくろんυうぷしろん είναι τたうαあるふぁ αντικείμενα πぱいοおみくろんυうぷしろん τたうοおみくろん πρόγραμμα δでるたεいぷしろんνにゅー πρόκειται νにゅーαあるふぁ χρησιμοποιήσει πάλι. Γがんまιいおたαあるふぁ παράδειγμα:

Object x = new Foo();
Object y = new Bar();
x = new Quux();
/* σしぐまεいぷしろん αυτό τたうοおみくろん σημείο γνωρίζουμε ότι τたうοおみくろん αντικείμενο Foo
 * πぱいοおみくろんυうぷしろん αρχικά δόθηκε σしぐまαあるふぁνにゅー τιμή σしぐまτたうηいーた x δでるたεいぷしろんνにゅー μπορεί πぱいιいおたαあるふぁ
 * νにゅーαあるふぁ χρησιμοποιηθεί: είναι συντακτικά απορρίμματα
 */

if(x.check_something()) {
 x.do_something(y);
}
System.exit(0);
/* στην παραπάνω ενότητα, ηいーた y *θしーたαあるふぁ μπορούσε* νにゅーαあるふぁ είναι σημασιολογικά
 * απορρίμματα, αλλά δでるたεいぷしろんνにゅー τたうοおみくろん γνωρίζουμε, μέχρι ηいーた x.check_something()
 * νにゅーαあるふぁ επιστρέψει κάποια τιμή (αあるふぁνにゅー τελικά επιστρέψει)
 */

Τたうοおみくろん πρόβλημα τたうοおみくろんυうぷしろん ακριβούς χαρακτηρισμού τたうωおめがνにゅー σημασιολογικών απορριμμάτων μπορεί νにゅーαあるふぁ αποδειχτεί ότι είναι μερικώς υπολογίσιμο: ένα πρόγραμμα πぱいοおみくろんυうぷしろん δεσμεύει μνήμη γがんまιいおたαあるふぁ ένα αντικείμενο X, εκτελεί ένα τυχαίο πρόγραμμα εισόδου P, κかっぱαあるふぁιいおた χρησιμοποιεί τたうοおみくろん X αあるふぁνにゅー κかっぱαあるふぁιいおた μόνο αあるふぁνにゅー τたうοおみくろん P τερματίζει θしーたαあるふぁ απαιτούσε έναν συλλέκτη απορριμμάτων πぱいοおみくろんυうぷしろん θしーたαあるふぁ έλυνε τたうοおみくろん πρόβλημα τερματισμού (halting problem). Αあるふぁνにゅー κかっぱαあるふぁιいおた οおみくろんιいおた συντηρητικές ευριστικές μέθοδοι γがんまιいおたαあるふぁ τたうοおみくろんνにゅー εντοπισμό σημασιολογικών απορριμμάτων εξακολουθούν νにゅーαあるふぁ αποτελούν ενεργό ερευνητικό πεδίο, οおみくろんιいおた περισσότεροι συλλέκτες απορριμμάτων σしぐまτたうηいーたνにゅー πράξη στοχεύουν σしぐまτたうηいーた συλλογή συντακτικών απορριμμάτων.

Ένα άλλο θέμα είναι ότι σしぐまεいぷしろん γλώσσες προγραμματισμού πぱいοおみくろんυうぷしろん υπάρχουν κかっぱαあるふぁιいおた τύποι αναφοράς (reference types) κかっぱαあるふぁιいおた βασικοί τύποι τιμής (unboxed value types), οおみくろん συλλέκτης απορριμμάτων πρέπει μみゅーεいぷしろん κάποιο τρόπο νにゅーαあるふぁ μπορεί νにゅーαあるふぁ ξεχωρίσει ποιες μεταβλητές της στοίβας ή πぱいοおみくろんιいおたαあるふぁ πεδία ενός αντικειμένου είναι τιμές κかっぱαあるふぁιいおた πぱいοおみくろんιいおたαあるふぁ είναι αναφορές: σしぐまτたうηいーた μνήμη μπορεί νにゅーαあるふぁ μみゅーηいーたνにゅー υπάρχει διαφορά μεταξύ ενός ακεραίου κかっぱαあるふぁιいおた μιας αναφοράς. Οおみくろん συλλέκτης απορριμμάτων τότε πρέπει νにゅーαあるふぁ γνωρίζει αあるふぁνにゅー ένα στοιχείο είναι αναφοράς, ώστε νにゅーαあるふぁ τたうοおみくろん ακολουθήσει, ή αあるふぁνにゅー είναι βασική τιμή (primitive value). Μみゅーιいおたαあるふぁ συνηθισμένη λύση είναι ηいーた χρήση δεικτών μみゅーεいぷしろん επιπλέον πληροφορία (tagged pointers).

Ισχυρές κかっぱαあるふぁιいおた ασθενείς αναφορές

Επεξεργασία

Οおみくろん συλλέκτης απορριμμάτων μπορεί νにゅーαあるふぁ αποδεσμεύει μόνο αντικείμενα προς τたうαあるふぁ οποία δでるたεいぷしろんνにゅー υπάρχουν αναφορές. Μπορούν όμως νにゅーαあるふぁ υπάρχουν κάποιες αναφορές, οおみくろんιいおた οποίες δでるたεいぷしろんνにゅー εμποδίζουν τたうηいーたνにゅー αποδέσμευση, οおみくろんιいおた οποίες ονομάζονται ασθενείς αναφορές (weak references). Όταν οおみくろんιいおた ασθενείς αναφορές συγκρίνονται μみゅーεいぷしろん τις συνηθισμένες αναφορές, οおみくろんιいおた τελευταίες τότε μπορεί νにゅーαあるふぁ ονομάζονται κかっぱαあるふぁιいおた ισχυρές αναφορές (strong references). Ένα αντικείμενο τότε συλλέγεται όταν δでるたεいぷしろんνにゅー υπάρχουν ισχυρές (δηλαδή κανονικές) αναφορές, ακόμα κかっぱαあるふぁιいおた αあるふぁνにゅー υπάρχουν ασθενείς αναφορές σしぐまεいぷしろん αυτό.

Μみゅーιいおたαあるふぁ ασθενής αναφορά δでるたεいぷしろんνにゅー είναι απλά ένας οποιοσδήποτε δείκτης σしぐまεいぷしろん ένα αντικείμενο γがんまιいおたαあるふぁ τたうοおみくろん οποίο δでるたεいぷしろんνにゅー ενδιαφέρεται οおみくろん συλλέκτης απορριμμάτων. Οおみくろん όρος συνήθως χρησιμοποιείται γがんまιいおたαあるふぁ μみゅーιいおたαあるふぁ ειδικά διαχειριζόμενη κατηγορία ειδικών αναφορών, πぱいοおみくろんυうぷしろん είναι ασφαλείς σしぐまτたうηいーた χρήση, ακόμα κかっぱαあるふぁιいおた όταν τたうοおみくろん αντικείμενό τους εξαφανιστεί, γιατί τότε αποκτούν κάποια ειδική κかっぱαあるふぁιいおた ασφαλή τιμή. Μみゅーιいおたαあるふぁ αναφορά πぱいοおみくろんυうぷしろん δでるたεいぷしろんνにゅー είναι ασφαλής κかっぱαあるふぁιいおた οおみくろん συλλέτης απορριμμάτων δでるたεいぷしろんνにゅー γνωρίζει γがんまιいおたαあるふぁ αυτήν, θしーたαあるふぁ μείνει «αιωρούμενη» (dangling) γιατί θしーたαあるふぁ συνεχίσει νにゅーαあるふぁ αναφέρεται σしぐまεいぷしろん μみゅーιいおたαあるふぁ διεύθυνση μνήμης, όπου τたうοおみくろん αντικείμενο ήταν σしぐまτたうοおみくろん παρελθόν. Αυτό δでるたεいぷしろんνにゅー είναι ασθενής αναφορά.

Ασθενείς συλλογές

Επεξεργασία

Υπάρχουν αντικείμενα πぱいοおみくろんυうぷしろん διατηρούν δείκτες προς συλλογές από άλλα αντικείμενα κかっぱαあるふぁιいおた τたうαあるふぁ παρακολουθούν μみゅーεいぷしろん ασθενή τρόπο. Γがんまιいおたαあるふぁ παράδειγμα, υπάρχουν ασθενείς πίνακες κατακερματισμού (weak hash tables). Όπως κかっぱαあるふぁιいおた σしぐまεいぷしろん έναν κανονικό πίνακα κατακερματισμού, σしぐまεいぷしろん έναν ασθενή πίνακα κατακερματισμού διατηρείται μみゅーιいおたαあるふぁ σχέση μεταξύ αντικειμένων σしぐまεいぷしろん ζεύγη, μみゅーεいぷしろん κάθε ζεύγος νにゅーαあるふぁ είναι ένα κλειδί κかっぱαあるふぁιいおた μみゅーιいおたαあるふぁ τιμή. Οおみくろん πίνακας κατακερματισμού όμως δでるたεいぷしろん διατηρεί κάποια ισχυρή αναφορά προς αυτά τたうαあるふぁ αντικείμενα. Όταν ένα κλειδί ή μみゅーιいおたαあるふぁ τιμή γίνει απόρριμμα ηいーた εγγραφή σしぐまτたうοおみくろんνにゅー πίνακα διαγράφεται στιγμιαία. Υπάρχουν επίσης περιπτώσεις τέτοιων πινάκων πぱいοおみくろんυうぷしろん έχουν μόνο ασθενή κλειδιά κかっぱαあるふぁιいおた οおみくろんιいおた αναφορές κλειδιών είναι ισχυρές ή τたうοおみくろん αντίθετο (ισχυρά κλειδιά κかっぱαあるふぁιいおた ασθενείς τιμές).

Οおみくろんιいおた ασθενείς πίνακες κατακερματισμού είναι σημαντικοί γιατί δίνουν τたうηいーた δυνατότητα αποθήκευσης σχέσεων μεταξύ αντικειμένων, αλλά μみゅーεいぷしろん τρόπο πぱいοおみくろんυうぷしろん τたうαあるふぁ αντικείμενα της σχέσης νにゅーαあるふぁ μπορούν νにゅーαあるふぁ γίνουν απορρίμματα αあるふぁνにゅー τίποτα σしぐまτたうοおみくろん πρόγραμμα δでるたεいぷしろんνにゅー έχει αναφορές προς αυτά (εκτός από τたうοおみくろんνにゅー ίδιο τたうοおみくろんνにゅー πίνακα). Αντίθετα, ηいーた χρήση ενός απλού πίνακα κατακερματισμού γがんまιいおたαあるふぁ αυτόν τたうοおみくろんνにゅー σκοπό θしーたαあるふぁ οδηγούσε σしぐまεいぷしろん διαρροή μνήμης.

Βασικός αλγόριθμος

Επεξεργασία

Ηいーた ανιχνευτική συλλογή απορριμμάτων ονομάζεται έτσι γιατί ανιχνεύει όλον τたうοおみくろんνにゅー χώρο εργασίας σしぐまτたうηいーた μνήμη. Ηいーた συλλογή γίνεται σしぐまεいぷしろん κύκλους. Ένας κύκλος αρχίζει όταν οおみくろん συλλέκτης αποφασίζει (ή λάβει ειδοποίηση) ότι χρειάζεται νにゅーαあるふぁ αποδεσμεύσει μνήμη, κάτι πぱいοおみくろんυうぷしろん συνήθως συμβαίνει όταν τたうοおみくろん σύστημα δでるたεいぷしろんνにゅー έχει μνήμη ελεύθερη. Ηいーた αρχική μέθοδος περιλάμβανε ένα απλό «μαρκάρισμα-και-σκούπισμα» (mark-and-sweep), σしぐまτたうοおみくろん οποίο όλος οおみくろん χώρος εργασίας εξετάζεται μία ή περισσότερες φορές.

Απλό μαρκάρισμα-και-σκούπισμα

Επεξεργασία

Σしぐまτたうοおみくろん απλό μαρκάρισμα-και-σκούπισμα, κάθε αντικείμενο σしぐまτたうηいーた μνήμη έχει ένα πεδίο (συνήθως ένα bit) πぱいοおみくろんυうぷしろん προορίζεται γがんまιいおたαあるふぁ χρήση αποκλειστικά από τたうηいーた συλλογή απορριμμάτων. Τたうοおみくろん πεδίο αυτό συνήθως είναι κενό, εκτός από τたうηいーた διάρκεια τたうοおみくろんυうぷしろん κύκλου συλλογής απορριμμάτων. Τたうοおみくろん πρώτο στάδιο της συλλογής διατρέχει ελεύθερα όλο τたうοおみくろん σύνολο τたうωおめがνにゅー ριζών ('root set'), μαρκάροντας κάθε αντικείμενο προς τたうοおみくろん οποίο υπάρχει δείκτης, σしぐまαあるふぁνにゅー σしぐまεいぷしろん χρήση ('in-use'). Επίσης μαρκάρονται κかっぱαあるふぁιいおた όλα τたうαあるふぁ αντικείμενα σしぐまτたうαあるふぁ οποία δείχνουν τたうαあるふぁ αντικείμενα πぱいοおみくろんυうぷしろん ήδη μαρκαρίστηκαν, κかっぱαあるふぁιいおた ούτω καθεξής, μέχρι νにゅーαあるふぁ μαρκαριστεί κάθε αντικείμενο σしぐまτたうοおみくろん οποίο μπορεί νにゅーαあるふぁ φτάσει κανείς μέσω δεικτών από τις ρίζες. Σしぐまτたうοおみくろん τέλος, σκανάρεται όλη ηいーた μνήμη από τたうηいーたνにゅー αρχή μέχρι τたうοおみくろん τέλος κかっぱαあるふぁιいおた εξετάζονται όλα τたうαあるふぁ ελεύθερα ή χρησιμοποιούμενα μέρη: όσα αντικείμενα εξακολουθούν νにゅーαあるふぁ έχουν κενό τたうοおみくろん πεδίο 'σしぐまεいぷしろん χρήση', δでるたεいぷしろんνにゅー είναι προσιτά από τたうοおみくろん πρόγραμμα ή τたうαあるふぁ δεδομένα τたうοおみくろんυうぷしろん κかっぱαあるふぁιいおた ηいーた μνήμη πぱいοおみくろんυうぷしろん καταναλώνουν αποδεσμεύεται. (Σしぐまτたうαあるふぁ αντικείμενα πぱいοおみくろんυうぷしろん έχουν μαρκαριστεί σしぐまαあるふぁνにゅー 'σしぐまεいぷしろん χρήση', τたうοおみくろん πεδίο αυτό καθαρίζεται γがんまιいおたαあるふぁ τたうοおみくろんνにゅー επόμενο κύκλο συλλογής απορριμμάτων.)

Ηいーた μέθοδος αυτή έχει διάφορα μειονεκτήματα, μみゅーεいぷしろん τたうοおみくろん κυριότερο νにゅーαあるふぁ είναι ότι όλο τたうοおみくろん υπόλοιπο σύστημα πρέπει νにゅーαあるふぁ σταματήσει κατά τたうηいーた διάρκεια της συλλογής επειδή απαγορεύεται κάθε αλλαγή τたうοおみくろんυうぷしろん χώρου της μνήμης. Αυτό έχει σしぐまαあるふぁνにゅー αποτέλεσμα τたうαあるふぁ προγράμματα νにゅーαあるふぁ 'παγώνουν' περιστασιακά (κかっぱαあるふぁιいおた απροειδοποίητα), αποκλείοντας έτσι τις εφαρμογές πραγματικού χρόνου. Επιπλέον, πρέπει νにゅーαあるふぁ εξεταστεί όλη ηいーた μνήμη πぱいοおみくろんυうぷしろん χρησιμοποιείται, συχνά δύο φορές, κάτι πぱいοおみくろんυうぷしろん μπορεί νにゅーαあるふぁ προκαλέσει προβλήματα σしぐまεいぷしろん συστήματα μみゅーεいぷしろん μνήμη σしぐまεいぷしろん σελίδες (paged memory).

Μαρκάρισμα τριών χρωμάτων

Επεξεργασία

Λόγω τたうωおめがνにゅー προβλημάτων της προηγούμενης μεθόδου, οおみくろんιいおた περισσότεροι σύγχρονοι αλγόριθμοι ανιχνευτικής συλλογής απορριμμάτων υλοποιούν κάποια παραλλαγή τたうοおみくろんυうぷしろん μαρκαρίσματος τριών χρωμάτων (tri-colour marking). Τたうοおみくろん μαρκάρισμα τριών χρωμάτων δουλεύει ως εξής:

  1. Αρχικά δημιουργεί άσπρα, γκρίζα κかっぱαあるふぁιいおた μαύρα σύνολα, τたうαあるふぁ οποία θしーたαあるふぁ χρησιμοποιηθούν γがんまιいおたαあるふぁ νにゅーαあるふぁ κρατείται πληροφορία γがんまιいおたαあるふぁ τたうηいーたνにゅー πρόοδο ενός κύκλου.
    • Τたうοおみくろん άσπρο σύνολο αρχικά είναι τたうοおみくろん σύνολο τたうωおめがνにゅー αντικειμένων πぱいοおみくろんυうぷしろん είναι υποψήφια γがんまιいおたαあるふぁ νにゅーαあるふぁ αποδεσμευτεί ηいーた μνήμη τους.
    • Τたうοおみくろん μαύρο σύνολο είναι τたうοおみくろん σύνολο τたうωおめがνにゅー αντικειμένων πぱいοおみくろんυうぷしろん μπορεί εύκολα νにゅーαあるふぁ δειχτεί ότι δでるたεいぷしろんνにゅー δείχνουν σしぐまεいぷしろん αντικείμενα σしぐまτたうοおみくろん άσπρο σύνολο (σしぐまεいぷしろん πολλές υλοποιήσεις αρχικά είναι τたうοおみくろん κενό σύνολο).
    • Τたうοおみくろん γκρίζο σύνολο είναι όλα τたうαあるふぁ αντικείμενα πぱいοおみくろんυうぷしろん είναι προσιτά από αναφορές στις ρίζες αλλά τたうαあるふぁ αντικείμενα σしぐまτたうαあるふぁ οποία δείχνουν τたうαあるふぁ γκρίζα αντικείμενα δでるたεいぷしろんνにゅー έχουν ανιχνευτεί ακόμα. Τたうαあるふぁ γκρίζα αντικείμενα είναι γνωστό ότι είναι προσιτά από τις ρίζες, άρα δでるたεいぷしろん μπορούν νにゅーαあるふぁ θεωρηθούν απορρίμματα: τελικά τたうαあるふぁ γκρίζα αντικείμενα θしーたαあるふぁ καταλήξουν σしぐまτたうοおみくろん μαύρο σύνολο. Τたうοおみくろん γκρίζο χρώμα σημαίνει ότι δでるたεいぷしろんνにゅー έχουν ελεγχθεί ακόμα όλα τたうαあるふぁ αντικείμενα σしぐまτたうαあるふぁ οποία δείχνει ένα αντικείμενο.
    • Τたうοおみくろん γκρίζο σύνολο αρχικά περιέχει τたうαあるふぁ αντικείμενα προς τたうαあるふぁ οποία υπάρχουν αναφορές από τたうοおみくろん επίπεδο τたうωおめがνにゅー ριζών ενώ συνήθως όλα τたうαあるふぁ υπόλοιπα αντικείμενα τοποθετούνται αρχικά σしぐまτたうοおみくろん άσπρο σύνολο.
    • Τたうαあるふぁ αντικείμενα μπορούν νにゅーαあるふぁ αλλάζουν χρώμα από άσπρο σしぐまεいぷしろん γκρίζο ή από γκρίζο σしぐまεいぷしろん άσπρο, ποτέ προς τたうηいーたνにゅー άλλη κατεύθυνση.
  2. Επιλέγεται ένα αντικείμενο από τたうοおみくろん γκρίζο σύνολο. Τたうοおみくろん αντικείμενο μετακινείται σしぐまτたうοおみくろん μαύρο σύνολο κかっぱαあるふぁιいおた τたうαあるふぁ άσπρα αντικείμενα σしぐまτたうαあるふぁ οποία αναφέρεται άμεσα γίνονται γκρίζα. Αυτό σημαίνει ότι τたうοおみくろん αντικείμενο δでるたεいぷしろん μπορεί θεωρηθεί απόρριμμα κかっぱαあるふぁιいおた τたうοおみくろん ίδιο ισχύει κかっぱαあるふぁιいおた γがんまιいおたαあるふぁ τたうαあるふぁ αντικείμενα σしぐまτたうαあるふぁ οποία δείχνει.
  3. Τたうοおみくろん προηγούμενο βήμα επαναλαμβάνεται μέχρι νにゅーαあるふぁ αδειάσει τたうοおみくろん γκρίζο σύνολο.
  4. Όταν δでるたεいぷしろんνにゅー υπάρχουν άλλα αντικείμενα σしぐまτたうοおみくろん γκρίζο σύνολο, όλα τたうαあるふぁ αντικείμενα πぱいοおみくろんυうぷしろん μένουν σしぐまτたうοおみくろん άσπρο σύνολο είναι προφανώς μみゅーηいーた προσιτά κかっぱαあるふぁιいおた οおみくろん χώρος πぱいοおみくろんυうぷしろん καταλαμβάνουν αποδεσμεύεται.

Τたうαあるふぁ 3 σύνολα χωρίζουν τたうηいーた μνήμη, μみゅーεいぷしろん κάθε αντικείμενο τたうοおみくろんυうぷしろん συστήματος, συμπεριλαμβανομένων τたうωおめがνにゅー ριζών, νにゅーαあるふぁ ανήκει ακριβώς σしぐまεいぷしろん ένα από αυτά τたうαあるふぁ σύνολα.

Οおみくろん αλγόριθμος τたうοおみくろんυうぷしろん μαρκαρίσματος τριών χρωμάτων διατηρεί τたうηいーたνにゅー εξής σημαντική αναλλοίωτη (invariant):

Κανένα μαύρο αντικείμενο δでるたεいぷしろんνにゅー δείχνει απευθείας σしぐまεいぷしろん άσπρο αντικείμενο.

Αυτό εγγυάται τたうηいーたνにゅー ασφαλή καταστροφή τたうωおめがνにゅー άσπρων αντικειμένων όταν αδειάσει τたうοおみくろん γκρίζο σύνολο. (Υπάρχουν εκδοχές τたうοおみくろんυうぷしろん αλγορίθμου πぱいοおみくろんυうぷしろん δでるたεいぷしろんνにゅー διατηρούν τたうηいーたνにゅー παραπάνω αναλλοίωτη αλλά εξακολουθούν νにゅーαあるふぁ ισχύουν οおみくろんιいおた βασικές ιδιότητες.)

Ηいーた μέθοδος τたうωおめがνにゅー τριών χρωμάτων έχει ένα σημαντικό πλεονέκτημα: μπορεί νにゅーαあるふぁ χρησιμοποιηθεί χωρίς τたうοおみくろん σύστημα νにゅーαあるふぁ σταματά γがんまιいおたαあるふぁ μεγάλα χρονικά διαστήματα. Αυτό επιτυγχάνεται μみゅーεいぷしろん τたうοおみくろん μαρκάρισμα αντικειμένων όταν αυτά δημιουργούνται κかっぱαあるふぁιいおた δεσμεύεται οおみくろん χώρος τους σしぐまτたうηいーた μνήμη, κかっぱαあるふぁιいおた κατά τたうηいーた διάρκεια της τροποποίησής τους από τたうοおみくろん πρόγραμμα, διατηρώντας τたうαあるふぁ σύνολο. Τたうοおみくろん σύστημα μπορεί νにゅーαあるふぁ παρακολουθεί τたうοおみくろん μέγεθος τたうωおめがνにゅー συνόλων κかっぱαあるふぁιいおた νにゅーαあるふぁ κάνει συλλογή απορριμμάτων περιοδικά, κかっぱαあるふぁιいおた όχι μόνο όταν χρειάζεται. Επίσης μみゅーεいぷしろん αυτόν τたうοおみくろんνにゅー τρόπο αποτρέπεται ηいーた ανίχνευση όλου τたうοおみくろんυうぷしろん χώρου εργασίας σしぐまτたうηいーた μνήμη σしぐまεいぷしろん κάθε κύκλο.

Στρατηγικές υλοποίησης

Επεξεργασία

Γがんまιいおたαあるふぁ τたうηいーたνにゅー υλοποίηση τたうοおみくろんυうぷしろん βασικού αλγορίθμου τριών χρωμάτων πρέπει νにゅーαあるふぁ ληφθούν κάποιες σημαντικές σχεδιαστικές αποφάσεις, οおみくろんιいおた οποίες επηρεάζουν σημαντικά τたうηいーたνにゅー ταχύτητα της συλλογής απορριμμάτων.

Μετακίνηση

Επεξεργασία

Όταν προσδιοριστεί τたうοおみくろん σύνολο τたうωおめがνにゅー προσιτών αντικειμένων, ηいーた συλλογή απορριμμάτων μπορεί απλά νにゅーαあるふぁ αποδεσμεύσει τたうηいーた μνήμη πぱいοおみくろんυうぷしろん καταλαμβάνουν τたうαあるふぁ απρόσιτα αντικείμενα, κかっぱαあるふぁιいおた νにゅーαあるふぁ αφήσουν όλη τたうηいーたνにゅー υπόλοιπη μνήμη ως έχει, ή νにゅーαあるふぁ αντιγράψει μερικά (ή όλα) τたうαあるふぁ προσιτά αντικείμενα σしぐまεいぷしろん έναν νέο χώρο σしぐまτたうηいーた μνήμη, ενημερώνοντας όλες τις αναφορές προς αυτά τたうαあるふぁ αντικείμενα. Αυτοί οおみくろんιいおた τρόποι συλλογής απορριμμάτων ονομάζονται «μみゅーηいーた μετακινούντες» κかっぱαあるふぁιいおた «μετακινούντες» αντίστοιχα ("non-moving" κかっぱαあるふぁιいおた "moving", ή εναλλακτικά, "non-compacting" κかっぱαあるふぁιいおた "compacting").

Εいぷしろんκかっぱ πρώτης όψεως, μみゅーιいおたαあるふぁ στρατηγική συλλογής απορριμμάτων μみゅーεいぷしろん μετακίνηση μπορεί νにゅーαあるふぁ μοιάζει μみゅーηいーた αποδοτική κかっぱαあるふぁιいおた αργή σしぐまεいぷしろん σχέση μみゅーεいぷしろん τたうηいーた στρατηγική πぱいοおみくろんυうぷしろん δでるたεいぷしろんνにゅー μετακινεί, γιατί σしぐまεいぷしろん κάθε κύκλο κάνει παραπάνω δουλειά. Σしぐまτたうηいーたνにゅー πράξη όμως ηいーた στρατηγική συλλογής απορριμμάτων μみゅーεいぷしろん μετακίνηση οδηγεί σしぐまεいぷしろん πολλά πλεονεκτήματα όσον αφορά τたうηいーたνにゅー ταχύτητα, τόσο κατά τたうηいーたνにゅー ίδια τたうηいーた συλλογή απορριμμάτων, όσο κかっぱαあるふぁιいおた κατά τたうηいーた διάρκεια της εκτέλεσης τたうοおみくろんυうぷしろん προγράμματος:

  • Δでるたεいぷしろんνにゅー χρειάζεται επιπλέον προσπάθεια γがんまιいおたαあるふぁ τたうηいーたνにゅー αποδέσμευση τたうοおみくろんυうぷしろん χώρου πぱいοおみくろんυうぷしろん καταλαμβάνουν τたうαあるふぁ νεκρά αντικείμενα: όλος οおみくろん χώρος της μνήμης, από τたうοおみくろんνにゅー οποίο μετακινήθηκαν αντικείμενα, θεωρείται ελεύθερος χώρος. Αντίθετα, ηいーた συλλογή απορριμμάτων χωρίς μετακίνηση πρέπει νにゅーαあるふぁ επισκεφτεί κάθε απρόσιτο αντικείμενο κかっぱαあるふぁιいおた μみゅーεいぷしろん κάποιον τρόπο νにゅーαあるふぁ αποδεσμεύσει τたうηいーた μνήμη τたうοおみくろんυうぷしろん.
  • Γがんまιいおたαあるふぁ τたうοおみくろんνにゅー ίδιο λόγο μみゅーεいぷしろん παραπάνω, χώρος γがんまιいおたαあるふぁ νέα αντικείμενα μπορεί νにゅーαあるふぁ δεσμευτεί πολύ γρήγορα. Επειδή ηいーた συλλογή απορριμμάτων μみゅーεいぷしろん μετακίνηση δημιουργεί μεγάλους συνεχείς χώρους μνήμης, τたうαあるふぁ νέα αντικείμενα μπορούν νにゅーαあるふぁ δεσμευτούν, αυξάνοντας απλά κατά ένα κάποιον δείκτη πぱいοおみくろんυうぷしろん δείχνει σしぐまεいぷしろん 'ελεύθερη μνήμη'. Αντίθετα, ηいーた συλλογή απορριμμάτων χωρίς μετακίνηση μπορεί μετά από κάποιο χρονικό διάστημα νにゅーαあるふぁ οδηγήσει σしぐまεいぷしろん κατακερματισμό (fragmentation) τたうοおみくろんυうぷしろん σωρού, μみゅーεいぷしろん αποτέλεσμα νにゅーαあるふぁ πρέπει νにゅーαあるふぁ χρησιμοποιηθούν δαπανηρές «ελεύθερες λίστες» ("free lists"), πぱいοおみくろんυうぷしろん δείχνουν πぱいοおみくろんιいおたαあるふぁ μみゅーπぱいλらむだοおみくろんκかっぱ μνήμης είναι διαθέσιμα γがんまιいおたαあるふぁ δέσμευση νέων αντικειμένων.
  • Αあるふぁνにゅー χρησιμοποιηθεί ηいーた κατάλληλη σειρά επίσκεψης τたうωおめがνにゅー περιεχομένων της μνήμης (γがんまιいおたαあるふぁ παράδειγμα, σしぐまτたうηいーたνにゅー περίπτωση τたうωおめがνにゅー λιστών, ηいーた επίσκεψη σしぐまεいぷしろん κάθε κόμβο πぱいρろーιいおたνにゅー τたうοおみくろんνにゅー προηγούμενο), τたうαあるふぁ αντικείμενα πぱいοおみくろんυうぷしろん αναφέρονται σしぐまεいぷしろん άλλα αντικείμενα συχνά μπορούν νにゅーαあるふぁ μετακινηθούν πολύ κοντά τたうοおみくろん ένα σしぐまτたうοおみくろん άλλο σしぐまτたうηいーた μνήμη, αυξάνοντας τたうηいーたνにゅー πιθανότητα νにゅーαあるふぁ ανήκουν σしぐまτたうηいーたνにゅー ίδια γραμμή κρυφής μνήμης (cache line), ή σしぐまτたうηいーたνにゅー ίδια σελίδα εικονικής μνήμης (virtual memory). Αυτό μπορεί νにゅーαあるふぁ κάνει τたうηいーたνにゅー πρόσβαση σしぐまεいぷしろん αυτά τたうαあるふぁ αντικείμενα πολύ γρήγορη, μέσω αυτών τたうωおめがνにゅー αναφορών.

Ένα μειονέκτημα της συλλογής απορριμμάτων μみゅーεいぷしろん μετακίνηση είναι ότι επιτρέπει πρόσβαση μόνο μέσω αναφορών πぱいοおみくろんυうぷしろん διαχειρίζεται τたうοおみくろん περιβάλλον της συλλογής απορριμμάτων, κかっぱαあるふぁιいおた δでるたεいぷしろんνにゅー επιτρέπει αριθμητική δεικτών. Αυτό συμβαίνει γιατί κάθε δείκτης προς ένα αντικείμενο δでるたεいぷしろんνにゅー θしーたαあるふぁ είναι έγκυρος όταν πぱいιいおたαあるふぁ ηいーた συλλογή απορριμμάτων έχει μετακινήσει τたうοおみくろん αντικείμενο, κかっぱαあるふぁιいおた γίνεται αιωρούμενος δείκτης (dangling pointer). Γがんまιいおたαあるふぁ τたうηいーたνにゅー επικοινωνία μみゅーεいぷしろん τたうοおみくろんνにゅー κώδικα μηχανής, ηいーた συλλογή απορριμμάτων πρέπει νにゅーαあるふぁ αντιγράψει τたうαあるふぁ περιεχόμενα τたうοおみくろんυうぷしろん αντικειμένου σしぐまεいぷしろん μみゅーιいおたαあるふぁ θέση εκτός της μνήμης πぱいοおみくろんυうぷしろん συλλέγεται. Μみゅーιいおたαあるふぁ άλλη προσέγγιση είναι τたうοおみくろん αντικείμενο νにゅーαあるふぁ είναι αμετακίνητο (pin), απαγορεύοντας σしぐまτたうηいーた συλλογή απορριμμάτων νにゅーαあるふぁ τたうοおみくろん μετακινήσει κかっぱαあるふぁιいおた επιτρέποντας σしぐまτたうηいーた μνήμη νにゅーαあるふぁ μοιράζεται μέσω απλών δεικτών (πιθανόν επιτρέποντας κかっぱαあるふぁιいおた τたうηいーたνにゅー αριθμητική δεικτών).[3]

Συλλογή μみゅーεいぷしろん αντιγραφή, μαρκάρισμα-και-σκούπισμα κかっぱαあるふぁιいおた μαρκάρισμα-χωρίς-σκούπισμα

Επεξεργασία

Οおみくろんιいおた συλλέκτες απορριμμάτων μπορούν νにゅーαあるふぁ κατηγοριοποιηθούν ανάλογα μみゅーεいぷしろん τたうοおみくろんνにゅー τρόπο πぱいοおみくろんυうぷしろん κρατούν τたうαあるふぁ τρία σύνολα αντικειμένων (άσπρα, γκρίζα κかっぱαあるふぁιいおた μαύρα) κατά τたうηいーた διάρκεια ενός κύκλου συλλογής.

Ηいーた πぱいιいおたοおみくろん ευθεία προσέγγιση είναι αυτή τたうοおみくろんυうぷしろん συλλέκτη αντιγραφής (semi-space collector), ηいーた οποία ανάγεται σしぐまτたうοおみくろん 1969. Σしぐまεいぷしろん αυτόν τたうοおみくろんνにゅー τρόπο συλλογής απορριμμάτων μみゅーεいぷしろん μετακίνηση, ηいーた μνήμη χωρίζεται σしぐまεいぷしろん δύο χώρους, σしぐまτたうοおみくろんνにゅー χώρο-από ("from space") κかっぱαあるふぁιいおた σしぐまτたうοおみくろんνにゅー χώρο-προς ("to space"). Αρχικά τたうαあるふぁ αντικείμενα βρίσκονται σしぐまτたうοおみくろんνにゅー χώρο "to space" μέχρι νにゅーαあるふぁ χρειαστεί συλλογή απορριμμάτων λόγω έλλειψης χώρου. Σしぐまτたうηいーたνにゅー αρχή της συλλογής, οおみくろん "to space" γίνεται "from space" κかっぱαあるふぁιいおた αντίστροφα (εναλλάσσονται οおみくろんιいおた ρόλοι τους). Τたうαあるふぁ αντικείμενα πぱいοおみくろんυうぷしろん είναι προσιτά από τたうοおみくろん σύνολο τたうωおめがνにゅー ριζών αντιγράφονται από τたうοおみくろんνにゅー "from space" σしぐまτたうοおみくろんνにゅー "to space". Τたうαあるふぁ αντικείμενα αυτά σαρώνονται σしぐまτたうηいーた συνέχεια κかっぱαあるふぁιいおた όλα τたうαあるふぁ αντικείμενα σしぐまτたうαあるふぁ οποία δείχνουν αντιγράφονται σしぐまτたうοおみくろんνにゅー "to space", μέχρι όλα τたうαあるふぁ προσιτά αντικείμενα νにゅーαあるふぁ αντιγραφούν εκεί. Όταν τたうοおみくろん πρόγραμμα συνεχίσει τたうηいーたνにゅー εκτέλεσή τたうοおみくろんυうぷしろん, τたうαあるふぁ νέα αντικείμενα δεσμεύονται πάλι σしぐまτたうοおみくろんνにゅー "to space", μέχρι νにゅーαあるふぁ γεμίσει κかっぱαあるふぁιいおた ηいーた διαδικασία νにゅーαあるふぁ επαναληφθεί. Τたうοおみくろん πλεονέκτημα αυτής της προσέγγισης είναι ηいーた απλότητα (τたうαあるふぁ σύνολα τたうωおめがνにゅー τριών χρωμάτων κατασκευάζονται έμμεσα κατά τたうηいーた διαδικασία της αντιγραφής), αλλά έχει τたうοおみくろん μειονέκτημα ότι απαιτείται μみゅーιいおたαあるふぁ σχετικά μεγάλη κかっぱαあるふぁιいおた συνεχής περιοχή ελεύθερης μνήμης σしぐまεいぷしろん κάθε κύκλο συλλογής. Ηいーた τεχνική αυτή ονομάζεται κかっぱαあるふぁιいおた stop-and-copy. Οおみくろん αλγόριθμος τたうοおみくろんυうぷしろん Cheney είναι βελτίωση τたうοおみくろんυうぷしろん συλλέκτη αντιγραφής.

Ένας συλλέκτης απορριμμάτων μみゅーεいぷしろん μαρκάρισμα κかっぱαあるふぁιいおた σκούπισμα (mark and sweep) κρατά ένα ή δύο bit σしぐまεいぷしろん κάθε αντικείμενο, τたうαあるふぁ οποία δείχνουν αあるふぁνにゅー είναι μαύρο ή άσπρο. Τたうοおみくろん γκρίζο σύνολο διατηρείται είτε σしぐまαあるふぁνにゅー ξεχωριστή λίστα (όπως ηいーた στοίβα της διεργασίας), είτε χρησιμοποιώντας κάποιο άλλο bit. Καθώς διατρέχεται τたうοおみくろん δέντρο τたうωおめがνにゅー αναφορών κατά τたうηいーた διάρκεια της συλλογής (ηいーた φάση τたうοおみくろんυうぷしろん «μαρκαρίσματος»), αυτά τたうαあるふぁ bit ενημερώνονται από τたうοおみくろんνにゅー συλλέκτη γがんまιいおたαあるふぁ νにゅーαあるふぁ αντικατοπτρίζουν τたうηいーたνにゅー τρέχουσα κατάσταση. Σしぐまτたうηいーた συνέχεια ένα τελικό «σκούπισμα» της μνήμης αποδεσμεύει τたうαあるふぁ άσπρα αντικείμενα. Ηいーた στρατηγική μαρκαρίσματος κかっぱαあるふぁιいおた σκουπίσματος έχει τたうοおみくろん πλεονέκτημα ότι, όταν καθοριστεί τたうοおみくろん σύνολο τたうωおめがνにゅー αντικειμένων πぱいοおみくろんυうぷしろん δでるたεいぷしろんνにゅー είναι προσιτά, μπορεί νにゅーαあるふぁ ακολουθηθεί μみゅーιいおたαあるふぁ στρατηγική μετακίνησης ή μみゅーηいーた μετακίνησης -- ηいーた επιλογή αυτή μάλιστα μπορεί νにゅーαあるふぁ γίνει ακόμα κかっぱαあるふぁιいおた κατά τたうοおみくろんνにゅー χρόνο εκτέλεσης, ανάλογα μみゅーεいぷしろん τたうηいーた διαθέσιμη μνήμη. Από τたうηいーたνにゅー άλλη πλευρά, έχει τたうοおみくろん μειονέκτημα ότι αυξάνεται λίγο τたうοおみくろん μέγεθος τたうωおめがνにゅー αντικειμένων.

Ένας συλλέκτης απορριμμάτων πぱいοおみくろんυうぷしろん μαρκάρει αλλά δでるたεいぷしろんνにゅー σκουπίζει (mark and don't sweep) κρατά, όπως κかっぱαあるふぁιいおた σしぐまτたうηいーたνにゅー προηγούμενη περίπτωση, ένα bit σしぐまεいぷしろん κάθε αντικείμενο γがんまιいおたαあるふぁ νにゅーαあるふぁ θυμάται αあるふぁνにゅー είναι άσπρο ή μαύρο -- τたうοおみくろん γκρίζο σύνολο διατηρείται είτε σしぐまαあるふぁνにゅー ξεχωριστή λίστα ή μみゅーεいぷしろん τたうηいーた χρήση κάποιου άλλου bit. Υπάρχουν όμως δύο βασικές διαφορές.

  • Τたうαあるふぁ χρώματα «μαύρο» κかっぱαあるふぁιいおた «άσπρο» σημαίνουν διαφορετικά πράγματα σしぐまεいぷしろん σχέση μみゅーεいぷしろん τたうοおみくろんνにゅー συλλέκτη απορριμμάτων μみゅーεいぷしろん μαρκάρισμα κかっぱαあるふぁιいおた σκούπισμα. Σしぐまεいぷしろん ένα σύστημα μαρκαρίσματος χωρίς σκούπισμα, όλα τたうαあるふぁ προσιτά αντικείμενα είναι πάντα μαύρα. Ένα αντικείμενο μαρκάρεται μαύρο όταν δεσμεύεται κかっぱαあるふぁιいおた μένει μαύρο, ακόμα κかっぱαあるふぁιいおた όταν δでるたεいぷしろんνにゅー είναι πぱいιいおたαあるふぁ προσιτό. Ένα άσπρο αντικείμενο είναι μνήμη πぱいοおみくろんυうぷしろん δでるたεいぷしろん χρησιμοποιείται κかっぱαあるふぁιいおた μπορεί νにゅーαあるふぁ δεσμευτεί.
  • Ηいーた ερμηνεία τたうοおみくろんυうぷしろん άσπρου/μαύρου bit μπορεί νにゅーαあるふぁ αλλάξει. Αρχικά τたうοおみくろん άσπρο/μαύρο bit μπορεί νにゅーαあるふぁ έχει τたうηいーた σημασία (0=άσπρο, 1=μαύρο). Αあるふぁνにゅー μみゅーιいおたαあるふぁ δέσμευση μνήμης δでるたεいぷしろんνにゅー μπορέσει νにゅーαあるふぁ βべーたρろーεいぷしろんιいおた αρκετή (άσπρη) μνήμη, τότε αυτό σημαίνει ότι όλα τたうαあるふぁ αντικείμενα είναι μαρκαρισμένα σしぐまαあるふぁνにゅー σしぐまεいぷしろん χρήση (μαύρα). Ηいーた σημασία τたうοおみくろんυうぷしろん άσπρου/μαύρου bit τότε εναλλάσσεται (γがんまιいおたαあるふぁ παράδειγμα, 0=μαύρο, 1=άσπρο) κかっぱαあるふぁιいおた όλα τたうαあるふぁ αντικείμενα γίνονται άσπρα. Αυτό έχει σしぐまαあるふぁνにゅー αποτέλεσμα νにゅーαあるふぁ μみゅーηいーたνにゅー ισχύει εκείνη τたうηいーた στιγμή ηいーた αναλλοίωτη ότι όλα τたうαあるふぁ προσιτά αντικείμενα είναι μαύρα, αλλά ηいーた πλήρης φάση μαρκαρίσματος πぱいοおみくろんυうぷしろん ακολουθεί τたうαあるふぁ ξανακάνει μαύρα. Όταν αυτό γίνει, όλη ηいーた μνήμη πぱいοおみくろんυうぷしろん δでるたεいぷしろんνにゅー είναι προσιτή έχει γίνει άσπρη. Δでるたεいぷしろんνにゅー χρειάζεται φάση «σκουπίσματος».

Συλλογή απορριμμάτων σしぐまεいぷしろん γενεές

Επεξεργασία

Έχει παρατηρηθεί ότι σしぐまεいぷしろん πολλά προγράμματα, τたうαあるふぁ πρόσφατα δημιουργημένα αντικείμενα είναι κかっぱαあるふぁιいおた αυτά πぱいοおみくろんυうぷしろん είναι κかっぱαあるふぁιいおた πぱいιいおたοおみくろん πιθανό νにゅーαあるふぁ μみゅーηいーたνにゅー είναι προσιτά σύντομα, κάτι πぱいοおみくろんυうぷしろん είναι γνωστό κかっぱαあるふぁιいおた ως βρεφική θνησιμότητα (infant mortality) ή γενεαλογική υπόθεση (generational hypothesis). Ηいーた συλλογή απορριμμάτων σしぐまεいぷしろん γενεές (generational garbage collection ή ephemeral garbage collection) χωρίζει τたうαあるふぁ αντικείμενα σしぐまεいぷしろん γενεές κかっぱαあるふぁιいおた, στους περισσότερους κύκλους, θしーたαあるふぁ τοποθετήσει μόνο τたうαあるふぁ αντικείμενα ενός υποσυνόλου τたうωおめがνにゅー γενεών αυτών σしぐまτたうοおみくろん αρχικό άσπρο σύνολο. Επιπλέον, τたうοおみくろん σύστημα χρόνου εκτέλεσης διατηρεί πληροφορίες γがんまιいおたαあるふぁ τις αναφορές μεταξύ τたうωおめがνにゅー γενεών, παρακολουθώντας τたうηいーた δημιουργία κかっぱαあるふぁιいおた τたうηいーたνにゅー ενημέρωση τたうωおめがνにゅー αναφορών. Όταν εκτελείται οおみくろん συλλέκτης απορριμμάτων, μπορεί νにゅーαあるふぁ χρησιμοποιήσει αυτήν τたうηいーたνにゅー πληροφορία γがんまιいおたαあるふぁ νにゅーαあるふぁ αποδείξει ότι κάποια αντικείμενα σしぐまτたうοおみくろん αρχικό άσπρο σύνολο δでるたεいぷしろんνにゅー είναι προσιτά χωρίς νにゅーαあるふぁ πρέπει νにゅーαあるふぁ διατρέξει ολόκληρο τたうοおみくろん δέντρο τたうωおめがνにゅー αναφορών. Αあるふぁνにゅー ηいーた γενεαολογική υπόθεση ισχύει, αυτό έχει σしぐまαあるふぁνにゅー αποτέλεσμα πぱいιいおたοおみくろん γρήγορους κύκλους συλλογής, ενώ συλλέγονται τたうαあるふぁ πぱいιいおたοおみくろん πολλά προσιτά αντικείμενα.

Γがんまιいおたαあるふぁ νにゅーαあるふぁ υλοποιηθεί αυτή ηいーた ιδέα, πολλοί συλλέκτες απορριμμάτων αυτού τたうοおみくろんυうぷしろん είδους χρησιμοποιούν διαφορετικές περιοχές μνήμης γがんまιいおたαあるふぁ αντικείμενα διαφορετικών ηλικιών. Όταν μみゅーιいおたαあるふぁ περιοχή γεμίσει, τたうαあるふぁ αντικείμενα σしぐまτたうαあるふぁ οποία αναφέρονται περιοχές μみゅーεいぷしろん μεγαλύτερη ηλικία αντιγράφονται σしぐまτたうηいーたνにゅー επόμενη περιοχή, κかっぱαあるふぁιいおた ολόκληρη ηいーた περιοχή μπορεί τότε νにゅーαあるふぁ χρησιμοποιηθεί γがんまιいおたαあるふぁ νέα αντικείμενα. Αυτή ηいーた τεχνική επιτρέπει πολύ γρήγορη σταδιακή (incremental) συλλογή απορριμμάτων, γιατί χρειάζεται μόνο συλλογή απορριμμάτων γがんまιいおたαあるふぁ μみゅーιいおたαあるふぁ περιοχή κάθε φορά.

Ηいーた συλλογή απορριμμάτων σしぐまεいぷしろん γενεές είναι μみゅーιいおたαあるふぁ ευριστική προσέγγιση κかっぱαあるふぁιいおた κάποια μみゅーηいーた προσιτά αντικείμενα δでるたεいぷしろん μπορούν νにゅーαあるふぁ αποδεσμευτούν κατά τたうηいーた διάρκεια κάθε κύκλου. Μπορεί επομένως σποραδικά νにゅーαあるふぁ χρειάζεται νにゅーαあるふぁ διενεργείται ένα πλήρες μαρκάρισμα κかっぱαあるふぁιいおた σκούπισμα ή μみゅーιいおたαあるふぁ συλλογή απορριμμάτων μみゅーεいぷしろん αντιγραφή, γがんまιいおたαあるふぁ τたうηいーたνにゅー αποδέσμευση όλου τたうοおみくろんυうぷしろん διαθέσιμου χώρου. Τたうαあるふぁ συστήματα χρόνου εκτέλεσης τたうωおめがνにゅー σύγχρονων γλωσσών προγραμματισμού (όπως ηいーた Java κかっぱαあるふぁιいおた τたうοおみくろん .NET Framework) συνήθως χρησιμοποιούν κάποια υβριδική στρατηγική πぱいοおみくろんυうぷしろん συνδυάζει τις στρατηγικές πぱいοおみくろんυうぷしろん ήδη αναφέρθηκαν. Γがんまιいおたαあるふぁ παράδειγμα, οおみくろんιいおた περισσότεροι κύκλοι συλλογής μπορεί νにゅーαあるふぁ εξετάζουν μόνο κάποιες γενεές, ενώ κάποιες φορές συμβαίνει μαρκάρισμα κかっぱαあるふぁιいおた σκούπισμα, κかっぱαあるふぁιいおた ακόμα πぱいιいおたοおみくろん σπάνια μみゅーιいおたαあるふぁ πλήρης αντιγραφή, ώστε νにゅーαあるふぁ ελέγχεται οおみくろん κατακερματισμός (fragmentation). Οおみくろんιいおた όροι "minor cycle" κかっぱαあるふぁιいおた "major cycle" χρησιμοποιούνται κάποιες φορές γがんまιいおたαあるふぁ νにゅーαあるふぁ περιγράψουν αυτά τたうαあるふぁ διαφορετικά επίπεδα συλλογής.

Stop-the-world, προσθετική κかっぱαあるふぁιいおた σύγχρονη συλλογή απορριμμάτων

Επεξεργασία

Οおみくろんιいおた απλοί συλλέκτες απορριμμάτων σταματούν εντελώς τたうηいーたνにゅー εκτέλεση τたうοおみくろんυうぷしろん προγράμματος (stop-the-world) γがんまιいおたαあるふぁ νにゅーαあるふぁ εκτελέσουν έναν κύκλο συλλογής, εξασφαλίζοντας ότι δでるたεいぷしろんνにゅー θしーたαあるふぁ δεσμευτούν νέα αντικείμενα, ούτε κάποια αντικείμενα πρόκειται νにゅーαあるふぁ γίνουν απρόσιτα κατά τたうηいーた συλλογή απορριμμάτων.

Τたうοおみくろん φανερό μειονέκτημα αυτής της τεχνικής είναι ότι τたうοおみくろん πρόγραμμα δでるたεいぷしろんνにゅー μπορεί νにゅーαあるふぁ συνεχίσει τις εργασίες τたうοおみくろんυうぷしろん όταν γίνεται ηいーた συλλογή απορριμμάτων κかっぱαあるふぁιいおた προκύπτει μみゅーιいおたαあるふぁ παύση ("embarrassing pause"). Αυτό έχει σしぐまαあるふぁνにゅー αποτέλεσμα ηいーた συλλογή απορριμμάτων τύπου stop-the-world νにゅーαあるふぁ είναι κατάλληλη κυρίως γがんまιいおたαあるふぁ προγράμματα χωρίς αλληλεπίδραση μみゅーεいぷしろん τたうοおみくろんνにゅー χρήστη. Τたうοおみくろん πλεονέκτημά της είναι ότι είναι πぱいιいおたοおみくろん εύκολο νにゅーαあるふぁ υλοποιηθεί κかっぱαあるふぁιいおた εκτελείται πぱいιいおたοおみくろん γρήγορα σしぐまεいぷしろん σχέση μみゅーεいぷしろん τたうηいーたνにゅー προσθετική συλλογή απορριμμάτων.

Οおみくろんιいおた προσθετικοί (incremental) κかっぱαあるふぁιいおた οおみくろんιいおた σύγχρονοι (concurrent) συλλέκτες απορριμμάτων έχουν σχεδιαστεί έτσι ώστε νにゅーαあるふぁ μειώνουν αυτήν τたうηいーたνにゅー «αναστάτωση» κατά τたうηいーたνにゅー εκτέλεση, παρεμβάλλοντας τις εργασίες τους στις δραστηριότητες τたうοおみくろんυうぷしろん κύριου προγράμματος. Οおみくろんιいおた προσθετικοί συλλέκτες απορριμμάτων κάνουν συλλογή απορριμμάτων σしぐまεいぷしろん διακριτές φάσεις, επιτρέποντας τたうηいーたνにゅー εκτέλεση τたうοおみくろんυうぷしろん προγράμματος ανάμεσα στις φάσεις αυτές (κかっぱαあるふぁιいおた κάποιες φορές κかっぱαあるふぁιいおた κατά τたうηいーた διάρκεια κάποιων από αυτές). Οおみくろんιいおた σύγχρονοι συλλέκτες απορριμμάτων δでるたεいぷしろんνにゅー σταματούν καθόλου τたうηいーたνにゅー εκτέλεση τたうοおみくろんυうぷしろん προγράμματος, εκτός ίσως γがんまιいおたαあるふぁ τたうοおみくろん μικρό χρονικό διάστημα πぱいοおみくろんυうぷしろん σαρώνεται ηいーた στοίβα τたうοおみくろんυうぷしろん προγράμματος. Όλες μαζί οおみくろんιいおた προσθετικές φάσεις όμως παίρνουν περισσότερο χρόνο γがんまιいおたαあるふぁ νにゅーαあるふぁ εκτελεστούν, σしぐまεいぷしろん σύγκριση μみゅーεいぷしろん ένα πέρασμα συνολικής συλλογής απορριμμάτων, επομένως οおみくろんιいおた συλλέκτες απορριμμάτων αυτού τたうοおみくろんυうぷしろん είδους μπορεί νにゅーαあるふぁ κάνουν λιγότερο έργο ανά μονάδα χρόνου.

Οおみくろんιいおた τεχνικές αυτές απαιτούν προσεκτική σχεδίαση ώστε νにゅーαあるふぁ μみゅーηいーたνにゅー υπάρχουν ανεπιθύμητες αλληλεπιδράσεις μεταξύ τたうοおみくろんυうぷしろん προγράμματος κかっぱαあるふぁιいおた τたうοおみくろんυうぷしろん συλλέκτη απορριμμάτων. Γがんまιいおたαあるふぁ παράδειγμα, όταν τたうοおみくろん πρόγραμμα θελήσει νにゅーαあるふぁ δεσμεύσει χώρο γがんまιいおたαあるふぁ κάποιο νέο αντικείμενο, τたうοおみくろん σύστημα χρόνου εκτέλεσης μπορεί νにゅーαあるふぁ τたうοおみくろん σταματήσει μέχρι νにゅーαあるふぁ ολοκληρωθεί ηいーた εκτέλεση, ή νにゅーαあるふぁ ειδοποιήσει μみゅーεいぷしろん κάποιον τρόπο τたうοおみくろんνにゅー συλλέκτη απορριμμάτων ότι υπάρχει ένα νέο, προσιτό αντικείμενο.

Ακριβής/συντηρητική συλλογή απορριμμάτων κかっぱαあるふぁιいおた εσωτερικοί δείκτες

Επεξεργασία

Οおみくろんιいおた συλλέκτες πぱいοおみくろんυうぷしろん μπορούν νにゅーαあるふぁ αναγνωρίσουν σωστά όλους τους δείκτες (αναφορές) σしぐまεいぷしろん ένα αντικείμενο ονομάζονται ακριβείς (precise, exact ή accurate), ενώ τたうοおみくろん αντίθετο είναι οおみくろんιいおた συντηρητικοί (conservative) ή μερικώς συντηρητικοί (partly conservative) συλλέκτες. Οおみくろんιいおた συντηρητικοί συλλέκτες υποθέτουν ότι κάθε αλληλουχία bit σしぐまτたうηいーた μνήμη μπορεί νにゅーαあるふぁ είναι δείκτης αあるふぁνにゅー, ερμηνευόμενη σしぐまαあるふぁνにゅー δείκτης, θしーたαあるふぁ έδειχνε σしぐまεいぷしろん κάποιο αντικείμενο πぱいοおみくろんυうぷしろん έχει δεσμευτεί σしぐまτたうηいーた μνήμη. Οおみくろんιいおた συντηρητικοί συλλέκτες μπορεί νにゅーαあるふぁ αναγνωρίσουν σしぐまαあるふぁνにゅー δείκτες λάθος δεδομένα (false positives), μみゅーεいぷしろん αποτέλεσμα νにゅーαあるふぁ μみゅーηいーたνにゅー αποδεσμεύεται μνήμη λόγω λάθους αναγνώρισης. Αυτό σしぐまτたうηいーたνにゅー πράξη δでるたεいぷしろんνにゅー είναι πάντα πρόβλημα, εκτός κかっぱαあるふぁιいおた αあるふぁνにゅー τたうοおみくろん πρόγραμμα χειρίζεται πολλά δεδομένα πぱいοおみくろんυうぷしろん μπορούν νにゅーαあるふぁ αναγνωριστούν λανθασμένα σしぐまαあるふぁνにゅー δείκτες. Οおみくろんιいおた περιπτώσεις λανθασμένης αναγνώρισης προκαλούν γενικά λιγότερα προβλήματα σしぐまεいぷしろん συστήματα 64-bit σしぐまεいぷしろん σχέση μみゅーεいぷしろん τたうαあるふぁ συστήματα 32-bit επειδή τたうοおみくろん εύρος τたうωおめがνにゅー έγκυρων διευθύνσεων μνήμης τείνει νにゅーαあるふぁ είναι ένα πολύ μικρό υποσύνολο τたうοおみくろんυうぷしろん εύρους τたうωおめがνにゅー τιμών 64-bit. Γがんまιいおたαあるふぁ αυτόν τたうοおみくろんνにゅー λόγο, είναι σπάνιο κάποια αλληλουχία τたうωおめがνにゅー 64 bit νにゅーαあるふぁ μοιάζει μみゅーεいぷしろん κάποιον έγκυρο δείκτη. Τたうοおみくろん αあるふぁνにゅー ένας ακριβής συλλέκτης απορριμμάτων εξυπηρετεί σしぐまτたうηいーたνにゅー πράξη εξαρτάται από τις ιδιότητες ασφάλειας τύπων (type safety) της εκάστοτε γλώσσας προγραμματισμού. Ένα παράδειγμα πぱいοおみくろんυうぷしろん χρειάζεται συντηρητικός συλλέκτης απορριμμάτων είναι ηいーた γλώσσα C, ηいーた οποία επιτρέπει τたうηいーたνにゅー μετατροπή μεταξύ δεικτών μみゅーεいぷしろん τύπο (όχι void) κかっぱαあるふぁιいおた δεικτών χωρίς τύπο (void).

Ένα σχετικό θέμα είναι αυτό τたうωおめがνにゅー εσωτερικών δεικτών (internal pointers), πぱいοおみくろんυうぷしろん είναι οおみくろんιいおた δείκτες σしぐまτたうαあるふぁ πεδία ενός αντικειμένου. Αあるふぁνにゅー ηいーた σημασιολογία της γλώσσας επιτρέπει εσωτερικούς δείκτες, τότε μπορούν νにゅーαあるふぁ υπάρχουν πολλές διαφορετικές διευθύνσεις πぱいοおみくろんυうぷしろん νにゅーαあるふぁ αναφέρονται σしぐまεいぷしろん μέρη τたうοおみくろんυうぷしろん ίδιου αντικειμένου, κάτι πぱいοおみくろんυうぷしろん περιπλέκει τたうηいーたνにゅー απόφαση αあるふぁνにゅー ένα αντικείμενο είναι απόρριμμα ή όχι. Ένα παράδειγμα είναι ηいーた γλώσσα C++, σしぐまτたうηいーたνにゅー οποία ηいーた πολλαπλή κληρονομικότητα μπορεί νにゅーαあるふぁ δημιουργήσει δείκτες προς αντικείμενα βάσης, οおみくろんιいおた οποίοι νにゅーαあるふぁ έχουν διαφορετικές διευθύνσεις. Ακόμα κかっぱαあるふぁιいおた σしぐまεいぷしろん γλώσσες όπως ηいーた Java, μπορούν νにゅーαあるふぁ εμφανίζονται εσωτερικοί δείκτες κατά τたうοおみくろんνにゅー υπολογισμό, γがんまιいおたαあるふぁ παράδειγμα, της διεύθυνσης ενός στοιχείου ενός πίνακα. Σしぐまεいぷしろん ένα πρόγραμμα πぱいοおみくろんυうぷしろん έχει υποστεί βελτιστοποίηση, οおみくろん αντίστοιχος δείκτης σしぐまτたうοおみくろん ίδιο τたうοおみくろん αντικείμενο μπορεί νにゅーαあるふぁ έχει ενημερωθεί σしぐまτたうοおみくろんνにゅー καταχωρητή σしぐまτたうοおみくろんνにゅー οποίο βρίσκεται – αυτό σημαίνει ότι πρέπει νにゅーαあるふぁ γίνεται σάρωση πぱいοおみくろんυうぷしろん νにゅーαあるふぁ βρίσκει αυτούς τους δείκτες.

Ταχύτητα εκτέλεσης

Επεξεργασία

Οおみくろんιいおた ανιχνευτικοί συλλέκτες απορριμμάτων έχουν κάποια κρυμμένη επιβάρυνση κατά τたうοおみくろんνにゅー χρόνο εκτέλεσης, πぱいοおみくろんυうぷしろん δでるたεいぷしろんνにゅー ελέγχεται από τたうοおみくろんνにゅー προγραμματιστή κかっぱαあるふぁιいおた μπορεί νにゅーαあるふぁ οδηγήσει σしぐまεいぷしろん προβλήματα ταχύτητας εκτέλεσης. Γがんまιいおたαあるふぁ παράδειγμα, οおみくろんιいおた συλλέκτες stop-the-world πぱいοおみくろんυうぷしろん χρησιμοποιούνται συχνά, σταματούν αυθαίρετα τたうηいーたνにゅー εκτέλεση τたうοおみくろんυうぷしろん προγράμματος σしぐまεいぷしろん διάφορες χρονικές στιγμές, κάτι πぱいοおみくろんυうぷしろん μπορεί νにゅーαあるふぁ κάνει τたうηいーた συλλογή απορριμμάτων αυτού τたうοおみくろんυうぷしろん είδους ακατάλληλη γがんまιいおたαあるふぁ κάποια ενσωματωμένα συστήματα, λογισμικών εξυπηρετητών υψηλής απόδοσης κかっぱαあるふぁιいおた εφαρμογές μみゅーεいぷしろん απαιτήσεις πραγματικού χρόνου.

Ρητή δέσμευση μνήμης σしぐまτたうοおみくろんνにゅー σωρό
  • αναζήτηση καλύτερου/πρώτου-κατάλληλου μみゅーπぱいλらむだοおみくろんκかっぱ μみゅーεいぷしろん επαρκές μέγεθος
  • διατήρηση λίστας ελεύθερου χώρου (free list)
Συλλογή απορριμμάτων
  • εντοπισμός προσιτών αντικειμένων
  • αντιγραφή προσιτών αντικειμένων σしぐまτたうηいーたνにゅー περίπτωση τたうωおめがνにゅー συλλεκτών αντιγραφής
  • σύνορα ανάγνωσης/εγγραφής (read/write barriers) σしぐまτたうηいーたνにゅー περίπτωση τたうωおめがνにゅー προσθετικών συλλεκτών
  • αναζήτηση καλύτερου/πρώτου-κατάλληλου μみゅーπぱいλらむだοおみくろんκかっぱ κかっぱαあるふぁιいおた διατήρηση της λίστας ελεύθερου χρόνου σしぐまτたうηいーたνにゅー περίπτωση τたうωおめがνにゅー συλλεκτών χωρίς αντιγραφή

Είναι δύσκολο νにゅーαあるふぁ συγκριθούν οおみくろんιいおた δύο παραπάνω προσεγγίσεις απευθείας, γιατί ηいーた συμπεριφορά τους εξαρτάται από τたうοおみくろん εκάστοτε περιβάλλον εκτέλεσης. Γがんまιいおたαあるふぁ παράδειγμα, σしぐまτたうηいーたνにゅー καλύτερη περίπτωση συλλογής απορριμμάτων, ηいーた δέσμευση μνήμης απλά αυξάνει έναν δείκτη, ενώ σしぐまτたうηいーたνにゅー καλύτερη περίπτωση ρητής δέσμευσης χώρου σしぐまτたうοおみくろんνにゅー σωρό, οおみくろん μηχανισμός δέσμευσης μνήμης διατηρεί λίστες ελεύθερης μνήμης διαφόρων μεγεθών, μみゅーεいぷしろん αποτέλεσμα ηいーた δέσμευση μνήμης απλά νにゅーαあるふぁ ακολουθεί έναν δείκτη. Ηいーた κατηγοριοποίηση όμως αυτή της μνήμης σしぐまεいぷしろん χώρους διαφορετικών μεγεθών συχνά προκαλεί εξωτερικό κατακερματισμό σしぐまεいぷしろん σημαντικό βαθμό, κάτι πぱいοおみくろんυうぷしろん μπορεί νにゅーαあるふぁ επηρεάσει αρνητικά τたうηいーたνにゅー συμπεριφορά της κρυφής μνήμης. Ηいーた δέσμευση μνήμης σしぐまεいぷしろん μみゅーιいおたαあるふぁ γλώσσα μみゅーεいぷしろん συλλογή απορριμμάτων μπορεί νにゅーαあるふぁ υλοποιηθεί μみゅーεいぷしろん δέσμευση σしぐまτたうοおみくろんνにゅー σωρό σしぐまτたうοおみくろん παρασκήνιο (κかっぱαあるふぁιいおた όχι μみゅーεいぷしろん τたうηいーたνにゅー αύξηση ενός δείκτη), επομένως τたうαあるふぁ παραπάνω πλεονεκτήματα όσον αφορά τたうηいーたνにゅー ταχύτητα μπορεί νにゅーαあるふぁ μみゅーηいーたνにゅー ισχύουν πぱいιいおたαあるふぁ. Σしぐまεいぷしろん κάποιες περιπτώσεις, όπως τたうαあるふぁ ενσωματωμένα συστήματα, ηいーた επιβάρυνση της συλλογής απορριμμάτων κかっぱαあるふぁιいおた της διαχείρισης τたうοおみくろんυうぷしろん σωρού μπορεί νにゅーαあるふぁ αποφευχθεί μみゅーεいぷしろん δέσμευση μνήμης από πぱいρろーιいおたνにゅー κかっぱαあるふぁιいおた χρήση ενός πぱいιいおたοおみくろん ελαφρού συστήματος γがんまιいおたαあるふぁ δέσμευση/αποδέσμευση.[4]

Ηいーた επιβάρυνση τたうωおめがνにゅー συνόρων εγγραφής (write barriers) είναι πぱいιいおたοおみくろん πιθανό νにゅーαあるふぁ είναι εμφανής σしぐまεいぷしろん προγράμματα σしぐまεいぷしろん προστακτικό σしぐまτたうυうぷしろんλらむだ, τたうαあるふぁ οποία συχνά γράφουν δείκτες σしぐまεいぷしろん υπάρχουσες δομές δεδομένων, σしぐまεいぷしろん αντίθεση μみゅーεいぷしろん τたうαあるふぁ προγράμματα σしぐまεいぷしろん συναρτησιακό σしぐまτたうυうぷしろんλらむだ, πぱいοおみくろんυうぷしろん κατασκευάζουν κάθε δεδομένο μみゅーιいおたαあるふぁ φορά κかっぱαあるふぁιいおた ποτέ δでるたεいぷしろんνにゅー τたうοおみくろん αλλάζουν.

Οおみくろんιいおた εξελίξεις σしぐまτたうηいーた συλλογή απορριμμάτων συχνά σχετίζονται μみゅーεいぷしろん ζητήματα ταχύτητας. Οおみくろんιいおた πρώτοι συλλέκτες απορριμμάτων ήταν τύπου stop-the-world, αλλά ηいーた ταχύτητα αυτής της προσέγγισης δでるたεいぷしろんνにゅー ήταν κατάλληλη γがんまιいおたαあるふぁ εφαρμογές πぱいοおみくろんυうぷしろん αλληλεπιδρούσαν μみゅーεいぷしろん τたうοおみくろんνにゅー χρήστη ή τたうοおみくろん περιβάλλον. Ηいーた προσθετική συλλογή απορριμμάτων απέφυγε αυτό τたうοおみくろん πρόβλημα, μみゅーεいぷしろん τたうοおみくろん μειονέκτημα ότι είχε μικρότερη αποδοτικότητα λόγω της χρήσης συνόρων. Οおみくろんιいおた τεχνικές γενεαλογικής συλλογής απορριμμάτων χρησιμοποιούνται στους συλλέκτες stop-the-world κかっぱαあるふぁιいおた στους προσθετικούς γがんまιいおたαあるふぁ νにゅーαあるふぁ αυξηθεί ηいーた ταχύτητά τους, μみゅーεいぷしろん τたうηいーたνにゅー παραδοχή ότι κάποια απορρίμματα θしーたαあるふぁ αργήσουν νにゅーαあるふぁ εντοπιστούν.

Ντετερμινισμός

Επεξεργασία
  • Ηいーた ανιχνευτική συλλογή απορριμμάτων δでるたεいぷしろんνにゅー είναι ντετερμινιστική όσον αφορά τたうοおみくろんνにゅー χρόνο της λήξης ζωής τたうωおめがνにゅー αντικειμένων (finalization). Ένα αντικείμενο πぱいοおみくろんυうぷしろん θεωρείται απόρριμμα, τελικά θしーたαあるふぁ εκκαθαριστεί, αλλά δでるたεいぷしろんνにゅー παρέχεται καμία εγγύηση γがんまιいおたαあるふぁ τたうοおみくろん πότε (ή ακόμα κかっぱαあるふぁιいおた τたうοおみくろん αあるふぁνにゅー) αυτό θしーたαあるふぁ γίνει. Αυτό έχει επιπτώσεις σしぐまτたうηいーたνにゅー ορθότητα προγράμματος, όταν τたうαあるふぁ αντικείμενα συνδέονται μみゅーεいぷしろん πόρους πぱいοおみくろんυうぷしろん δでるたεいぷしろんνにゅー ανήκουν σしぐまτたうηいーた μνήμη, κかっぱαあるふぁιいおた ηいーた αποδέσμευση τたうωおめがνにゅー οποίων αποτελεί εξωτερική συμπεριφορά τたうοおみくろんυうぷしろん προγράμματος, όπως ηいーた διακοπή μιας σύνδεση δικτύου, ηいーた απελευθέρωση μιας συσκευής ή τたうοおみくろん κλείσιμο ενός αρχείου. Μみゅーιいおたαあるふぁ τεχνική συλλογής απορριμμάτων πぱいοおみくろんυうぷしろん παρέχει ντετερμινισμό σしぐまεいぷしろん αυτές τις περιπτώσεις είναι τたうοおみくろん καταμέτρηση αναφορών (reference counting).
  • Ηいーた συλλογή απορριμμάτων μπορεί νにゅーαあるふぁ έχει μみゅーηいーた ντετερμινιστική επίδραση σしぐまτたうοおみくろんνにゅー χρόνο εκτέλεσης, εισάγοντας κάποιες φορές παύσεις σしぐまτたうηいーたνにゅー εκτέλεση τたうοおみくろんυうぷしろん προγράμματος, οおみくろんιいおた οποίες δでるたεいぷしろんνにゅー σχετίζονται μみゅーεいぷしろん τたうοおみくろんνにゅー αλγόριθμο πぱいοおみくろんυうぷしろん εκτελείται. Σしぐまτたうηいーたνにゅー ανιχνευτική συλλογή απορριμμάτων, μみゅーιいおたαあるふぁ αίτηση γがんまιいおたαあるふぁ δέσμευση χώρου σしぐまτたうηいーた μνήμη μπορεί νにゅーαあるふぁ επιστρέψει κάποιο αποτέλεσμα αμέσως ή νにゅーαあるふぁ οδηγήσει σしぐまεいぷしろん μみゅーιいおたαあるふぁ χρονοβόρα συλλογή απορριμμάτων. Σしぐまτたうηいーたνにゅー καταμέτρηση αναφορών, αあるふぁνにゅー κかっぱαあるふぁιいおた ηいーた δέσμευση μνήμης γがんまιいおたαあるふぁ αντικείμενα είναι συνήθως γρήγορη, ηいーた μείωση ενός μετρητή μιας αναφοράς είναι μみゅーηいーた ντετερμινιστική, γιατί μπορεί νにゅーαあるふぁ γίνει μηδέν κかっぱαあるふぁιいおた νにゅーαあるふぁ οδηγήσει σしぐまεいぷしろん αναδρομική διάσχιση της μνήμης ώστε νにゅーαあるふぁ μειωθούν κかっぱαあるふぁιいおた οおみくろんιいおた μετρητές τたうωおめがνにゅー αναφορών τたうωおめがνにゅー άλλων αντικειμένων σしぐまτたうαあるふぁ οποία δείχνει τたうοおみくろん αντικείμενο.

Συλλογή απορριμμάτων σしぐまεいぷしろん πραγματικό χρόνο

Επεξεργασία

Αあるふぁνにゅー κかっぱαあるふぁιいおた ηいーた συλλογή απορριμμάτων είναι γενικά μみゅーηいーた ντετερμινιστική, μπορεί νにゅーαあるふぁ χρησιμοποιηθεί σしぐまεいぷしろん συστήματα αυστηρά πραγματικού χρόνου (hard real-time). Ένας συλλέκτης πραγματικού χρόνου μπορεί νにゅーαあるふぁ εγγυηθεί ότι, σしぐまτたうηいーた χειρότερη περίπτωση, θしーたαあるふぁ παραχωρήσει έναν συγκεκριμένο αριθμό υπολογιστικών πόρων σしぐまτたうοおみくろん τμήμα τたうοおみくろんυうぷしろん προγράμματος πぱいοおみくろんυうぷしろん χρειάζεται τたうηいーた μνήμη. Οおみくろんιいおた περιορισμοί πぱいοおみくろんυうぷしろん ακολουθεί ένας συλλέκτης πραγματικού χρόνου βασίζονται συνήθως είτε σしぐまτたうοおみくろんνにゅー φόρτο εργασίας (work based), είτε σしぐまτたうοおみくろんνにゅー χρόνο (time based). Ένας περιορισμός σしぐまτたうοおみくろんνにゅー χρόνο θしーたαあるふぁ μπορούσε νにゅーαあるふぁ είναι οおみくろん εξής: σしぐまεいぷしろん κάθε χρονικό παράθυρο διάρκειας T, τたうοおみくろん πρόγραμμα θしーたαあるふぁ πρέπει νにゅーαあるふぁ εκτελείται τουλάχιστον γがんまιいおたαあるふぁ χρόνο Tm. Σしぐまτたうηいーたνにゅー περίπτωση της ανάλυσης τたうοおみくろんυうぷしろん φόρτου εργασίας, χρησιμοποιείται συνήθως τたうοおみくろん μέγεθος MMU (minimal mutator utilization).[5]

Μみゅーιいおたαあるふぁ από τις πρώτες υλοποιήσεις συλλογής απορριμμάτων πραγματικού χρόνου γがんまιいおたαあるふぁ τたうηいーたνにゅー JVM αφορούσε τたうοおみくろんνにゅー αλγόριθμο Metronome.[6] Υπάρχουν επίσης άλλες εμπορικές υλοποιήσεις.[7]

Καταμέτρηση αναφορών

Επεξεργασία

Ηいーた καταμέτρηση αναφορών είναι μみゅーιいおたαあるふぁ μορφή συλλογής απορριμμάτων όπου κάθε αντικείμενο διατηρεί τたうοおみくろんνにゅー αριθμό τたうωおめがνにゅー αντικειμένων πぱいοおみくろんυうぷしろん έχουν αναφορές προς αυτό. Τたうαあるふぁ απορρίμματα είναι όσα αντικείμενα έχουν μηδέν αναφορές. Οおみくろん μετρητής ενός αντικειμένου αυξάνεται όταν δημιουργείται μみゅーιいおたαあるふぁ αναφορά προς αυτό κかっぱαあるふぁιいおた μειώνεται όταν μみゅーιいおたαあるふぁ τέτοια αναφορά καταστρέφεται. Ηいーた μνήμη πぱいοおみくろんυうぷしろん καταλαμβάνει τたうοおみくろん αντικείμενο απελευθερώνεται όταν οおみくろん μετρητής φτάσει τたうοおみくろん μηδέν.

Ηいーた καταμέτρηση αναφορών έχει δύο σημαντικά μειονεκτήματα:

  • Αあるふぁνにゅー δύο ή περισσότερα αντικείμενα δείχνουν τたうοおみくろん ένα σしぐまτたうοおみくろん άλλο, μπορεί νにゅーαあるふぁ δημιουργείται κύκλος, σしぐまτたうοおみくろんνにゅー οποίο κανένας μετρητής δでるたεいぷしろんνにゅー πρόκειται νにゅーαあるふぁ φτάσει τたうοおみくろん μηδέν κかっぱαあるふぁιいおた ηいーた μνήμη κανενός αντικειμένου δでるたεいぷしろんνにゅー πρόκειται νにゅーαあるふぁ απελευθερωθεί. Κάποια συστήματα συλλογής απορριμμάτων μみゅーεいぷしろん καταμέτρηση αναφορών (όπως αυτό της CPython) χρησιμοποιούν ειδικούς αλγόριθμους εντοπισμού κύκλων γがんまιいおたαあるふぁ νにゅーαあるふぁ αντιμετωπίσουν αυτό τたうοおみくろん πρόβλημα.[8] Μみゅーιいおたαあるふぁ άλλη στρατηγική είναι ηいーた χρήση ασθενών αναφορών (weak references) γがんまιいおたαあるふぁ τους δείκτες προς τたうαあるふぁ πίσω, οおみくろんιいおた οποίοι δημιουργούν τους κύκλους. Σしぐまτたうηいーたνにゅー καταμέτρηση αναφορών, μみゅーιいおたαあるふぁ ασθενής αναφορά λειτουργεί όπως μみゅーιいおたαあるふぁ ασθενής αναφορά σしぐまεいぷしろん έναν ανιχνευτικό συλλέκτη απορριμμάτων. Είναι ένα ιδιαίτερο αντικείμενο-αναφορά, ηいーた ύπαρξη τたうοおみくろんυうぷしろん οποίου δでるたεいぷしろんνにゅー αυξάνει τたうοおみくろんνにゅー μετρητή αναφορών ενός αντικειμένου πぱいοおみくろんυうぷしろん δείχνει σしぐまεいぷしろん αυτό. Επιπλέον μみゅーιいおたαあるふぁ ασθενής αναφορά είναι ασθενής μみゅーεいぷしろん τたうηいーたνにゅー έννοια ότι όταν τたうοおみくろん αντικείμενο πぱいοおみくろんυうぷしろん αναφέρεται σしぐまεいぷしろん αυτήν γίνεται απόρριμμα, κάθε ασθενής αναφορά σしぐまεいぷしろん αυτό λήγει (lapses) αντί νにゅーαあるふぁ μείνει αιωρούμενη, παίρνει δηλαδή κάποια προβλεπόμενη τιμή, όπως ηいーた κενή αναφορά (null).
  • Στις απλές υλοποιήσεις, κάθε ανάθεση σしぐまεいぷしろん αναφορά κかっぱαあるふぁιいおた κάθε αναφορά πぱいοおみくろんυうぷしろん βγαίνει εκτός εμβέλειας, έχουν ως αποτέλεσμα τたうηいーたνにゅー αλλαγή ενός ή περισσότερων μετρητών αναφορών. Σしぐまτたうηいーたνにゅー πぱいιいおたοおみくろん συνηθισμένη περίπτωση όμως, όταν μみゅーιいおたαあるふぁ αναφορά αντιγράφεται από μみゅーιいおたαあるふぁ μεταβλητή της εξωτερικής εμβέλειας σしぐまεいぷしろん μみゅーιいおたαあるふぁ μεταβλητή εσωτερικής εμβέλειας, τέτοια ώστε οおみくろん χρόνος ζωής της εσωτερικής μεταβλητής νにゅーαあるふぁ περιλαμβάνεται σしぐまτたうοおみくろんνにゅー χρόνο ζωής της εξωτερικής, δでるたεいぷしろんνにゅー χρειάζεται ηいーた αλλαγή στους μετρητές. Ηいーた εξωτερική μεταβλητή «έχει» τたうηいーたνにゅー αναφορά. Σしぐまτたうηいーたνにゅー γλώσσα προγραμματισμού C++, ηいーた τεχνική αυτή υλοποιείται μみゅーεいぷしろん τις αναφορές const. Ηいーた καταμέτρηση αναφορών σしぐまτたうηいーた C++ συνήθως υλοποιείται μみゅーεいぷしろん τたうηいーた χρήση «έξυπνων δεικτών» ("smart pointers"), πぱいοおみくろんυうぷしろん έχουν συναρτήσεις κατασκευής (constructors), καταστροφής (destructors) κかっぱαあるふぁιいおた ανάθεσης πぱいοおみくろんυうぷしろん χειρίζονται τις αναφορές. Ένας έξυπνος δείκτης μπορεί νにゅーαあるふぁ περαστεί μみゅーεいぷしろん αναφορά σしぐまεいぷしろん μみゅーιいおたαあるふぁ συνάρτηση, έτσι ώστε νにゅーαあるふぁ μみゅーηいーたνにゅー χρειαστεί νにゅーαあるふぁ κατασκευαστεί μみゅーιいおたαあるふぁ νέα αναφορά μみゅーεいぷしろん αντιγραφή (πぱいοおみくろんυうぷしろん θしーたαあるふぁ αύξανε τたうοおみくろんνにゅー μετρητή αναφορών κατά τたうηいーたνにゅー είσοδο σしぐまτたうηいーた συνάρτηση κかっぱαあるふぁιいおた θしーたαあるふぁ τたうοおみくろんνにゅー μείωνε κατά τたうηいーたνにゅー έξοδο). Αντίθετα, ηいーた συνάρτηση δέχεται μみゅーιいおたαあるふぁ αναφορά σしぐまτたうοおみくろんνにゅー έξυπνο δείκτη, τたうηいーたνにゅー οποία τたうηいーた δημιουργεί μみゅーεいぷしろん μικρό κόστος.
  • Οおみくろんιいおた αλλαγές αυτές (αύξηση κかっぱαあるふぁιいおた μείωση κατά ένα), όταν χρησιμοποιούνται σしぐまεいぷしろん πολυνηματικό περιβάλλον, πρέπει νにゅーαあるふぁ είναι ατομικές λειτουργίες, όπως ηいーた compare-and-swap, όταν εμπλέκουν αντικείμενα πぱいοおみくろんυうぷしろん μπορεί νにゅーαあるふぁ μοιράζονται ανάμεσα σしぐまεいぷしろん διαφορετικά νήματα. Οおみくろんιいおた ατομικές λειτουργίες έχουν κόστος στους πολυεπεξεργαστές κかっぱαあるふぁιいおた είναι ακόμα πぱいιいおたοおみくろん δαπανηρές, όταν πρέπει νにゅーαあるふぁ προσομοιωθούν από αλγόριθμους σしぐまεいぷしろん λογισμικό. Υπάρχουν τρόποι νにゅーαあるふぁ βελτιωθεί αυτή ηいーた κατάσταση, όπως ηいーた χρήση αναφορών σしぐまεいぷしろん δύο επίπεδα, μみゅーεいぷしろん πολλαπλούς μετρητές.
  • Θεωρείται συχνά λανθασμένα ότι ηいーた καταμέτρηση αναφορών έχει ντετερμινιστική συμπεριφορά όσον αφορά τたうοおみくろん χρόνο εκτέλεσής τたうοおみくろんυうぷしろん, σしぐまεいぷしろん σχέση μみゅーεいぷしろん τたうηいーたνにゅー ανιχνευτική συλλογή απορριμμάτων. Ηいーた καταμέτρηση αναφορών παρέχει ηいーたμみゅーιいおた-ντετερμινιστική αποδοτικότητα όσον αφορά τたうηいーたνにゅー αποδέσμευση σしぐまεいぷしろん περιπτώσεις πぱいοおみくろんυうぷしろん τたうαあるふぁ αντικείμενα προφανώς ζぜーたοおみくろんυうぷしろんνにゅー λίγο (στις ίδιες συνθήκες πぱいοおみくろんυうぷしろん κかっぱαあるふぁιいおた οおみくろんιいおた τεχνικές γενεαλογικής συλλογής απορριμμάτων έχουν ηいーたμみゅーιいおた-ντετερμινιστική συμπεριφορά). Σしぐまτたうηいーたνにゅー γενική περίπτωση, όταν μειώνεται οおみくろん μετρητής της αναφοράς ενός αντικειμένου, δでるたεいぷしろんνにゅー μπορεί νにゅーαあるふぁ μετρηθεί πόσος χρόνος θしーたαあるふぁ χρειαστεί γがんまιいおたαあるふぁ αυτό από τたうοおみくろんνにゅー επεξεργαστή. Κάθε φορά πぱいοおみくろんυうぷしろん ένας μετρητής γίνεται μηδέν, κかっぱαあるふぁιいおた άρα τたうοおみくろん αντίστοιχο αντικείμενο γίνεται απόρριμμα, πρέπει νにゅーαあるふぁ μειωθούν κかっぱαあるふぁιいおた όλοι οおみくろんιいおた μετρητές τたうωおめがνにゅー αντικειμένων πぱいοおみくろんυうぷしろん ανήκουν σしぐまτたうοおみくろん αντικείμενο. Κάποιοι από αυτούς τους μετρητές μπορούν επίσης νにゅーαあるふぁ γίνουν μηδέν, επαναλαμβάνοντας αυτήν τたうηいーた διαδικασία, μみゅーεいぷしろん αποτέλεσμα ηいーた καταμέτρηση αναφορών σしぐまτたうηいーたνにゅー γενική περίπτωση νにゅーαあるふぁ έχει μみゅーηいーた ντετερμινιστικές παύσεις.

Ηいーた ανάλυση διαφυγής (escape analysis) μπορεί νにゅーαあるふぁ χρησιμοποιηθεί γがんまιいおたαあるふぁ νにゅーαあるふぁ μετατρέψει τたうηいーた δέσμευση χώρου σしぐまτたうοおみくろんνにゅー σωρό σしぐまεいぷしろん δέσμευση σしぐまτたうηいーた στοίβα, μειώνοντας τたうοおみくろん έργο τたうοおみくろんυうぷしろん συλλέκτη απορριμμάτων.

Συλλογή απορριμμάτων κατά τたうηいーた μεταγλώττιση

Επεξεργασία

Ηいーた συλλογή απορριμμάτων κατά τたうηいーた μεταγλώττιση (compile-time garbage collection) είναι μみゅーιいおたαあるふぁ μορφή στατικής ανάλυσης πぱいοおみくろんυうぷしろん επιτρέπει σしぐまτたうηいーた μνήμη νにゅーαあるふぁ επαναχρησιμοποιείται κかっぱαあるふぁιいおた νにゅーαあるふぁ απελευθερώνεται μみゅーεいぷしろん βάση αναλλοίωτες συνθήκες πぱいοおみくろんυうぷしろん είναι γνωστές από τたうηいーた φάση της μεταγλώττισης. Αυτή ηいーた μορφή συλλογής απορριμμάτων μελετήθηκε σしぐまτたうηいーた γλώσσα προγραμματισμού Mercury.[9]

Διαθεσιμότητα

Επεξεργασία

Οおみくろんιいおた γλώσσες προγραμματισμού υψηλού επιπέδου είναι πぱいιいおたοおみくろん πιθανό νにゅーαあるふぁ έχουν σしぐまαあるふぁνにゅー βασικό χαρακτηριστικό τたうηいーた συλλογή απορριμμάτων. Οおみくろんιいおた γλώσσες πぱいοおみくろんυうぷしろん δでるたεいぷしろんνにゅー περιλαμβάνουν συλλογή απορριμμάτων, μπορούν νにゅーαあるふぁ τたうηいーたνにゅー αποκτήσουν μみゅーεいぷしろん τたうηいーた βοήθεια εξωτερικών βιβλιοθηκών (όπως οおみくろん συλλέκτης απορριμμάτων τたうοおみくろんυうぷしろん Boehm γがんまιいおたαあるふぁ τたうηいーた C κかっぱαあるふぁιいおた τたうηいーた C++). Αυτό δでるたεいぷしろんνにゅー είναι πάντα χωρίς προβλήματα, αφού αλλάζουν οおみくろんιいおた μηχανισμοί δημιουργίας κかっぱαあるふぁιいおた καταστροφής τたうωおめがνにゅー αντικειμένων.

Οおみくろんιいおた περισσότερες συναρτησιακές γλώσσες προγραμματισμού, όπως ηいーた ML, ηいーた Haskell κかっぱαあるふぁιいおた ηいーた APL, περιλαμβάνουν συλλογή απορριμμάτων. Οおみくろん ίδιος οおみくろん μηχανισμός εμφανίστηκε γがんまιいおたαあるふぁ πρώτη φορά σしぐまτたうηいーた Lisp, ηいーた οποία κかっぱαあるふぁιいおた εισήγαγε τたうοおみくろんνにゅー συναρτησιακό προγραμματισμό.

Άλλες δυναμικές γλώσσες, όπως ηいーた Ruby (αλλά όχι ηいーた Perl 5, ή ηいーた PHP, πぱいοおみくろんυうぷしろん χρησιμοποιούν καταμέτρηση αναφορών), τείνουν επίσης νにゅーαあるふぁ χρησιμοποιούν συλλογή απορριμμάτων. Οおみくろんιいおた αντικειμενοστρεφείς γλώσσες όπως ηいーた Smalltalk, ηいーた Java κかっぱαあるふぁιいおた ηいーた ECMAScript συχνά ενσωματώνουν συλλογή απορριμμάτων. Εξαιρέσεις αποτελούν ηいーた C++ κかっぱαあるふぁιいおた ηいーた Delphi, οおみくろんιいおた οποίες έχουν συναρτήσεις καταστροφής (destructors). Ηいーた Objective-C σしぐまτたうοおみくろん παρελθόν δでるたεいぷしろんνにゅー είχε συλλογή απορριμμάτων, αλλά ηいーた ObjC 2.0 που υλοποιήθηκε από τたうηいーたνにゅー Apple γがんまιいおたαあるふぁ τたうοおみくろん Mac OS X χρησιμοποιεί έναν δικό της συλλέκτη σしぐまτたうοおみくろん χρόνο εκτέλεσης, ενώ τたうοおみくろん εγχείρημα GNUstep χρησιμοποιεί έναν συλλέκτη Boehm.

Ιστορικά, οおみくろんιいおた γλώσσες πぱいοおみくろんυうぷしろん απευθύνονταν σしぐまεいぷしろん αρχάριους, όπως ηいーた BASIC κかっぱαあるふぁιいおた ηいーた Logo, συχνά χρησιμοποιούσαν συλλογή απορριμμάτων γがんまιいおたαあるふぁ τύπους δεδομένων μεταβλητού μήκους πぱいοおみくろんυうぷしろん αποθηκεύονταν σしぐまτたうοおみくろんνにゅー σωρό, όπως οおみくろんιいおた συμβολοσειρές κかっぱαあるふぁιいおた οおみくろんιいおた λίστες, ώστε νにゅーαあるふぁ μみゅーηいーたνにゅー δυσκολεύουν τたうοおみくろんνにゅー προγραμματιστή μみゅーεいぷしろん λεπτομέρειες διαχείρισης μνήμης. Στους πρώτους μικροϋπολογιστές, πぱいοおみくろんυうぷしろん είχαν μικρές μνήμες κかっぱαあるふぁιいおた αργούς επεξεργαστές, ηいーた συλλογή απορριμμάτων της BASIC συχνά προκαλούσε τυχαίες κかっぱαあるふぁιいおた (γがんまιいおたαあるふぁ τたうοおみくろんνにゅー χρήστη) ανεξήγητες παύσεις κατά τたうηいーたνにゅー εκτέλεση τたうοおみくろんυうぷしろん προγράμματος. Κάποιοι διερμηνείς της BASIC όπως οおみくろん Applesoft BASIC της οικογένειας τたうωおめがνにゅー Apple II, είχαν πολύ αργούς συλλέκτες απορριμμάτων γがんまιいおたαあるふぁ τις συμβολοσειρές, πぱいοおみくろんυうぷしろん σάρωναν συνέχεια τις συμβολοσειρές γがんまιいおたαあるふぁ νにゅーαあるふぁ τοποθετήσουν αυτές μみゅーεいぷしろん τたうηいーたνにゅー υψηλότερη διεύθυνση, στις υψηλότερες θέσεις μνήμης (high memory). Αυτή ηいーた επανάληψη γがんまιいおたαあるふぁ μみゅーιいおたαあるふぁ συμβολοσειρά κάθε φορά είχα σしぐまαあるふぁνにゅー αποτέλεσμα πολυπλοκότητα χρόνου O(N*N) όσον αφορά τたうοおみくろんνにゅー αριθμό τたうωおめがνにゅー συμβολοσειρών, πぱいοおみくろんυうぷしろん μπορούσε νにゅーαあるふぁ διακόψει προσωρινά τたうηいーたνにゅー εκτέλεση προγραμμάτων πぱいοおみくろんυうぷしろん έκαναν συχνή χρήση συμβολοσειρών, ακόμα κかっぱαあるふぁιいおた γがんまιいおたαあるふぁ ένα λεπτό. Ένας άλλος συλλέκτης απορριμμάτων γがんまιいおたαあるふぁ τたうηいーたνにゅー Applesoft BASIC πぱいοおみくろんυうぷしろん δημοσιεύτηκε σしぐまτたうοおみくろん Call-A.P.P.L.E. (Ιανουάριος 1981, σしぐまεいぷしろんλらむだ. 40–45, Randy Wiggington) έβρισκε μみゅーιいおたαあるふぁ ομάδα συμβολοσειρών σしぐまεいぷしろん κάθε πέρασμα σしぐまτたうοおみくろんνにゅー σωρό, μみゅーεいぷしろん αποτέλεσμα μみゅーιいおたαあるふぁ παύση τたうωおめがνにゅー δύο λεπτών νにゅーαあるふぁ γίνεται ενός δευτερολέπτου, ανάλογα κかっぱαあるふぁιいおた μみゅーεいぷしろん τたうοおみくろん μέγεθος της ομάδας. Δημοσιεύτηκαν κかっぱαあるふぁιいおた άλλες προσεγγίσεις, αλλά καμία δでるたεいぷしろんνにゅー έφτασε νにゅーαあるふぁ μみゅーπぱいεいぷしろんιいおた σしぐまεいぷしろん κάποια νεότερη έκδοση τたうοおみくろんυうぷしろん διερμηνέα της BASIC.

Περιορισμένα περιβάλλοντα

Επεξεργασία

Ηいーた συλλογή απορριμμάτων σπάνια χρησιμοποιείται σしぐまεいぷしろん ενσωματωμένα συστήματα ή σしぐまεいぷしろん συστήματα πραγματικού χρόνου, όπου απαιτείται πολύ αυστηρός έλεγχος της χρήσης τたうωおめがνにゅー περιορισμένων διαθέσιμων πόρων. Παρόλα αυτά, έχουν αναπτυχθεί συλλέκτες γがんまιいおたαあるふぁ τέτοια περιορισμένα περιβάλλοντα.[10] Τたうοおみくろん .NET Micro Framework της Microsoft κかっぱαあるふぁιいおた ηいーた Java Platform, Micro Edition είναι ενσωματωμένες πλατφόρμες λογισμικού, οおみくろんιいおた οποίες, όπως κかっぱαあるふぁιいおた οおみくろんιいおた μεγαλύτερες εκδόσεις τους, περιλαμβάνουν συλλογή απορριμμάτων.

Παραπομπές

Επεξεργασία
  1. «Recursive functions of symbolic expressions and their computation by machine». Portal.acm.org. Ανακτήθηκε στις 29 Μαρτίου 2009. 
  2. «Recursive functions of symbolic expressions and their computation by machine, Part I». Αρχειοθετήθηκε από τたうοおみくろん πρωτότυπο στις 4 Οκτωβρίου 2013. Ανακτήθηκε στις 29 Μαΐου 2009. 
  3. «Copying and Pinning». Msdn2.microsoft.com. Ανακτήθηκε στις 9 Ιουλίου 2010. 
  4. «Memory allocation in embedded systems». Eros-os.org. Αρχειοθετήθηκε από τたうοおみくろん πρωτότυπο στις 6 Μαρτίου 2012. Ανακτήθηκε στις 29 Μαρτίου 2009. 
  5. «A parallel, real-time garbage collector». ACM SIGPLAN Notices 36.5: 125–136. 22. doi:378795.378823. http://dl.acm.org/citation.cfm?doid=378795.378823. 
  6. «The Metronome: A Simpler Approach to Garbage Collection in Real-Time Systems» (PDF). 
  7. «Real-time Java, Part 4: Real-time garbage collection». 
  8. «Reference Counts». Extending and Embedding the Python Interpreter. 21 Φεβρουαρίου 2008. Αρχειοθετήθηκε από τたうοおみくろん πρωτότυπο στις 23 Οκτωβρίου 2008. Ανακτήθηκε στις 13 Νοεμβρίου 2008. While Python uses the traditional reference counting implementation, it also offers a cycle detector that works to detect reference cycles. 
  9. «Compile-time garbage collection for the declarative language Mercury». Αρχειοθετήθηκε από τたうοおみくろん πρωτότυπο στις 18 Ιουλίου 2008. Ανακτήθηκε στις 14 Μαρτίου 2012. 
  10. «Wei Fu and Carl Hauser, "A Real-Time Garbage Collection Framework for Embedded Systems". ACM SCOPES '05, 2005». Portal.acm.org. Ανακτήθηκε στις 9 Ιουλίου 2010. 

Βιβλιογραφία

Επεξεργασία

Εξωτερικοί σύνδεσμοι

Επεξεργασία
Υλοποιήσεις