Sobes.tech
Middle

Πώς να προσδιορίσετε ποιο αντικείμενο στη Java είναι σκουπίδια;

sobes.tech AI

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

Ένα αντικείμενο θεωρείται απορρίμματα στη Java όταν δεν υπάρχουν πλέον αναφορές σε αυτό από τα ενεργά μέρη του προγράμματος. Αυτό συμβαίνει στις ακόλουθες περιπτώσεις:

  • Χωρίς αναφορές από ριζικά αντικείμενα (αναφορές ρίζας): Τα ριζικά αντικείμενα περιλαμβάνουν αναφορές από:

    • Τοπικές μεταβλητές σε ενεργά νήματα.
    • Στατικές μεταβλητές.
    • Αναφορές JNI (αντικείμενα προσβάσιμα από κώδικα native).
  • Μόνο αναφορές από άλλα "απορρίμματα" αντικείμενα: Ακόμα και αν το αντικείμενο O1 αναφέρεται στο αντικείμενο O2, αλλά ούτε το O1 ούτε το O2 έχουν αναφορές από ριζικά αντικείμενα, και τα δύο αντικείμενα θεωρούνται απορρίμματα.

Παράδειγμα:

// Ριζική αναφορά από μια στατική μεταβλητή
static Object staticObject = new Object();

// Ριζική αναφορά από μια τοπική μεταβλητή σε ενεργή μέθοδο
public void someMethod() {
    Object localObject = new Object(); // Αναφορά από τοπική μεταβλητή
    // Μετά την έξοδο από το someMethod, το localObject γίνεται μη προσβάσιμο
}

// Παράδειγμα "απορρίμματος" αντικειμένου
public Object createGarbage() {
    Object obj1 = new Object();
    Object obj2 = new Object();
    obj1 = obj2; // το obj1 τώρα αναφέρεται στο ίδιο αντικείμενο με το obj2
    // Το αρχικό αντικείμενο, στο οποίο αναφερόταν το obj1, δεν είναι πλέον προσβάσιμο και θεωρείται απορρίμματα
    return obj2; // Επιστρέφει την αναφορά σε ένα ζωντανό αντικείμενο
}

Ο συλλέκτης απορριμμάτων στη Java καθορίζει τα μη προσβάσιμα αντικείμενα χρησιμοποιώντας τον αλγόριθμο "ιχνηλάτησης προσβασιμότητας" (reachability tracing), ξεκινώντας από τα ριζικά αντικείμενα. Τα αντικείμενα που δεν μπορούν να προσεγγιστούν μέσω αλυσίδας αναφορών από τα ριζικά αντικείμενα θεωρούνται μη προσβάσιμα και συλλέγονται.