Sobes.tech
Middle

Υπάρχουν σύνδεσμοι που δείχνουν πώς λειτουργεί ο συλλέκτης απορριμμάτων;

sobes.tech AI

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

Ναι, είναι δυνατή η δημιουργία παραδειγμάτων που να δείχνουν την επίδραση του συλλέκτη απορριμμάτων.

// Παράδειγμα 1: Δημιουργία μεγάλου αριθμού αντικειμένων

public class GarbageCollectionDemo1 {

    public static void main(String[] args) {
        List<DummyObject> objects = new ArrayList<>();
        for (int i = 0; i < 1000000; i++) {
            objects.add(new DummyObject(i)); // Δημιουργία πολλών αντικειμένων
        }
        // Σε αυτό το σημείο, ο συλλέκτης απορριμμάτων μπορεί να κληθεί για να ελευθερώσει μνήμη
        // αν τα αντικείμενα στη λίστα δεν χρησιμοποιούνται πουθενά αλλού.
        // Ακόμα και αν δεν κληθεί ρητά, θα ενεργοποιηθεί όταν χρειαστεί.

        // Το άδειασμα της λίστας μπορεί να ελευθερώσει πιθανώς μνήμη
        objects.clear(); 

        System.gc(); // Ρητή αίτηση για συλλογή απορριμμάτων (δεν εγγυάται την εκτέλεση)
    }

    static class DummyObject {
        private int id;

        public DummyObject(int id) {
            this.id = id;
        }

        @Override
        protected void finalize() throws Throwable {
            // Η μέθοδος finalize καλείται πριν από τη συλλογή απορριμμάτων (δεν εγγυάται και δεν συνιστάται)
            // System.out.println("Αντικείμενο με id: " + id + " συλλέγεται.");
        }
    }
}
// Παράδειγμα 2: Μηδενισμός αναφορών

public class GarbageCollectionDemo2 {

    public static void main(String[] args) {
        Object obj = new Object(); // Δημιουργία αντικειμένου
        System.out.println("Δημιουργία αντικειμένου."); 

        obj = null; // Αφαίρεση αναφοράς στο αντικείμενο. Τώρα είναι επιλέξιμο για συλλογή απορριμμάτων.
        System.out.println("Αναφορά στο αντικείμενο ορίστηκε σε null.");

        System.gc(); // Ρητή αίτηση για συλλογή απορριμμάτων
    }
}

Αυτά τα παραδείγματα δείχνουν πώς η δημιουργία πολλών αντικειμένων ή η διαγραφή αναφορών καθιστά τα αντικείμενα επιλέξιμα για συλλογή απορριμμάτων. Είναι σημαντικό να κατανοήσετε ότι η ρητή κλήση του System.gc() δεν εγγυάται την άμεση εκτέλεση του συλλέκτη απορριμμάτων; η JVM αποφασίζει πότε θα το κάνει, βασιζόμενη στους εσωτερικούς αλγορίθμους της.