Sobes.tech
Middle

Czy istnieją linki demonstrujące działanie zbieracza śmieci?

sobes.tech AI

Odpowiedź od AI

Tak, można stworzyć przykłady demonstrujące wpływ zbieracza śmieci.

// Przykład 1: Tworzenie dużej liczby obiektów

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)); // Tworzenie wielu obiektów
        }
        // W tym momencie, może zostać wywołany zbieracz śmieci, aby zwolnić pamięć
        // jeśli obiekty na liście nie są używane nigdzie indziej.
        // Nawet jeśli nie jest wywoływany jawnie, zostanie uruchomiony w razie potrzeby.

        // Czyszczenie listy potencjalnie zwolni pamięć
        objects.clear(); 

        System.gc(); // Jawne żądanie zbierania śmieci (nie gwarantuje wykonania)
    }

    static class DummyObject {
        private int id;

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

        @Override
        protected void finalize() throws Throwable {
            // Metoda finalize jest wywoływana przed zbieraniem śmieci (nie gwarantowana i niezalecana)
            // System.out.println("Obiekt z id: " + id + " jest zbierany.");
        }
    }
}
// Przykład 2: Ustawianie referencji na null

public class GarbageCollectionDemo2 {

    public static void main(String[] args) {
        Object obj = new Object(); // Tworzenie obiektu
        System.out.println("Obiekt utworzony."); 

        obj = null; // Usunięcie referencji do obiektu. Teraz jest on kwalifikowany do zbierania śmieci.
        System.out.println("Referencja do obiektu ustawiona na null.");

        System.gc(); // Jawne żądanie zbierania śmieci
    }
}

Te przykłady pokazują, jak tworzenie dużej liczby obiektów lub usuwanie referencji sprawia, że obiekty stają się kwalifikowalne do zbierania śmieci. Ważne jest, aby zrozumieć, że wywołanie System.gc() nie gwarantuje natychmiastowego uruchomienia zbieracza śmieci; JVM decyduje, kiedy go uruchomi, opierając się na własnych algorytmach wewnętrznych.