Sobes.tech
Middle

Existujú odkazy, ktoré ukazujú, ako funguje zberač odpadu?

sobes.tech AI

Odpoveď od AI

Áno, je možné vytvoriť príklady, ktoré demonštrujú vplyv zbera odpadu.

// Príklad 1: Vytvorenie veľkého množstva objektov

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)); // Vytvorenie veľkého množstva objektov
        }
        // V tomto momente môže byť volaný zberač odpadu na uvoľnenie pamäte
        // ak objekty v zozname nie sú používané nikde inde.
        // Aj keď nie je explicitne volaný, aktivuje sa podľa potreby.

        // Vyprázdnenie zoznamu môže potenciálne uvoľniť pamäť
        objects.clear(); 

        System.gc(); // Priamy požiadavok na zber odpadu (nezaručuje vykonanie)
    }

    static class DummyObject {
        private int id;

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

        @Override
        protected void finalize() throws Throwable {
            // Metóda finalize sa volá pred zberom odpadu (nie je garantovaná a neodporúča sa)
            // System.out.println("Objekt s id: " + id + " sa zbiera.");
        }
    }
}
// Príklad 2: Nastavenie odkazov na null

public class GarbageCollectionDemo2 {

    public static void main(String[] args) {
        Object obj = new Object(); // Vytvorenie objektu
        System.out.println("Objekt vytvorený."); 

        obj = null; // Odstránenie odkazu na objekt. Teraz je vhodný na zber odpadu.
        System.out.println("Odkaz na objekt nastavený na null.");

        System.gc(); // Priamy požiadavok na zber odpadu
    }
}

Tieto príklady ukazujú, ako vytvorenie veľkého množstva objektov alebo odstránenie odkazov robí objekty vhodnými na zber odpadu. Je dôležité pochopiť, že priame volanie System.gc() nezaručuje okamžité spustenie zberača odpadu; JVM rozhodne, kedy ho spustí, na základe svojich interných algoritmov.