A garbage collection method that distinguishes between local objects and
managed objects, and between an ordinary pointer to an object, an owning
pointer to an object, and a non-owning pointer to an object is presented.
Ordinary pointers point only to local objects, and owning and non-owning
pointers point only to managed objects. Managed objects have attributes
including a count of the number of owning pointers referring to them, and
a linked list of non-owning pointers referring to them. Managed objects
only possess non-owning pointers. Only an invocation of a subroutine
within a thread can possess an owning pointer. Using this method, when an
invocation exits, its exit code gives up ownership of all objects it
owned. When an object is no longer reachable from any owning pointer,
either directly, or indirectly through non-owning pointers, the object is
immediately de-allocated. By implementing data structures and methods to
support owning pointers, non-owning pointers, and managed objects, and by
enforcing rules regarding the use of ordinary pointers, owning pointers,
and non-owning pointers, efficient and deterministic garbage collection is
achieved, memory leaks and dangling pointers are eliminated, and objects
containing circular references to each other are not a source of memory
leaks.
Μια μέθοδος συλλογής απορριμάτων που διακρίνουν μεταξύ των τοπικών αντικειμένων και των διοικούμενων αντικειμένων, και μεταξύ ενός συνηθισμένου δείκτη σε ένα αντικείμενο, έναν όντας κύριο δείκτη σε ένα αντικείμενο, και ένας μη-όντας κύριος δείκτης σε ένα αντικείμενο παρουσιάζονται. Οι συνηθισμένοι δείκτες δείχνουν μόνο τα τοπικά αντικείμενα, και η ιδιοκτησία και η μη-ιδιοκτησία των δεικτών δείχνουν μόνο τα διοικούμενα αντικείμενα. Τα διοικούμενα αντικείμενα έχουν τις ιδιότητες συμπεριλαμβανομένης μιας αρίθμησης του αριθμού ιδιοκτησίας των δεικτών που αναφέρονται σε τους, και έναν συνδεμένο κατάλογο μη-ιδιοκτησίας των δεικτών που αναφέρονται σε τους. Τα διοικούμενα αντικείμενα κατέχουν μόνο την μη-ιδιοκτησία των δεικτών. Μόνο μια επίκληση μιας υπορουτίνας μέσα σε ένα νήμα μπορεί να κατέχει έναν όντας κύριο δείκτη. Χρησιμοποιώντας αυτήν την μέθοδο, όταν βγαίνει μια επίκληση, ο κώδικας εξόδων του σταματά την ιδιοκτησία όλων των αντικειμένων που ήταν κύρια. Όταν ένα αντικείμενο δεν είναι πλέον εφικτό από οποιοδήποτε όντας κύριο δείκτη, είτε άμεσα, είτε έμμεσα μέσω της μη-ιδιοκτησίας των δεικτών, το αντικείμενο απελευθερώνεται αμέσως. Με την εφαρμογή των δομών δεδομένων και των μεθόδων για να υποστηρίξει την ιδιοκτησία των δεικτών, μη-που είναι κύριων των δεικτών, και των διοικούμενων αντικειμένων, και με την επιβολή των κανόνων σχετικά με τη χρήση των συνηθισμένων δεικτών, την ιδιοκτησία των δεικτών, και την μη-ιδιοκτησία των δεικτών, η αποδοτική και αιτιοκρατική συλλογή απορριμάτων επιτυγχάνεται, οι διαρροές μνήμης και οι ταλαντεύοντας δείκτες αποβάλλονται, και τα αντικείμενα που περιέχουν τις κυκλικές αναφορές το ένα στο άλλο δεν είναι μια πηγή διαρροών μνήμης.