Sobes.tech
Middle

Existem links que demonstram como funciona o coletor de lixo?

sobes.tech IA

Resposta da IA

Sim, é possível criar exemplos que demonstrem a influência do recolhedor de lixo.

// Exemplo 1: Criação de uma grande quantidade de objetos

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)); // Criar muitos objetos
        }
        // Neste momento, o recolhedor de lixo pode ser chamado para libertar memória
        // se os objetos da lista não forem utilizados em mais lado nenhum.
        // Mesmo que não seja chamado explicitamente, ativar-se-á quando necessário.

        // Limpar a lista pode potencialmente libertar memória
        objects.clear(); 

        System.gc(); // Pedido explícito de recolha de lixo (não garante execução)
    }

    static class DummyObject {
        private int id;

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

        @Override
        protected void finalize() throws Throwable {
            // O método finalize é chamado antes da recolha de lixo (não garantido e não recomendado)
            // System.out.println("A recolha do objeto com id: " + id);
        }
    }
}
// Exemplo 2: Atribuição de null às referências

public class GarbageCollectionDemo2 {

    public static void main(String[] args) {
        Object obj = new Object(); // Criar um objeto
        System.out.println("Objeto criado."); 

        obj = null; // Remover a referência ao objeto. Agora é elegível para recolha de lixo.
        System.out.println("Referência ao objeto definida como null.");

        System.gc(); // Pedido explícito de recolha de lixo
    }
}

Estes exemplos demonstram como a criação de muitos objetos ou a eliminação de referências torna os objetos elegíveis para recolha de lixo. É importante entender que a chamada explícita a System.gc() não garante que o recolhedor de lixo seja executado imediatamente; a JVM decide quando fazê-lo, com base nos seus algoritmos internos.