Como funciona a Garbage collection em Java

O processo de Garbage Collection (coleta de lixo) na JVM é crucial para liberar memória e otimizar o desempenho.

Por
2 min. de leitura

Fala, meus consagrados! Beleza?

O Garbage collection (coleta de lixo) é o processo em que o JRE exclui objetos quando aquele determina que estes não estão mais sendo usados. Não é necessário a destruição explícita dos objetos criados.

Um objeto elegível para coleta de lixo é um objeto que não possui mais referências, ou seja, todas as referências a um objeto devem ser descartadas antes que o objeto seja elegível para coleta de lixo

Referências mantidas em uma variável são normalmente descartadas quando:

  • A variável sai do escopo em que ela se encontra; ou
  • Um valor null é atribuído explicitamente à variável-objeto.

Figura 1: Tipos de garbage collection.

Há os seguintes tipos de garbage collection:

  • Minor Garbage Collection:
    • Coleta de Lixo Menor;
    • É quando os objetos são coletados ao garbage collection da Young Generation;
    • Enquanto está sendo executada, todas as threads da aplicação são paralisadas;
  • Major Garbage Collection:
    • Coleta de Lixo Maior;
    • É quando os objetos são lixo coletado da Old Generation; e
  • Full Garbage Collection:
    • Coleta de Lixo Completa; 
    • É quando os objetos são lixo coletado da Permanent Generation.

O Garbage Collector é um programa que está dentro do JRE. Não é controlado pelo programador: a JVM decide quando executá-lo.

O garbage collector:

  • Libera periodicamente a memória usada por objetos que não são mais referenciados; e
  • Faz o seu trabalho automaticamente quando determina que é a hora certa;
    • Não há um momento pré-determinado.

Há dois métodos na linguagem Java que são relacionados com o Gabarge Collection:

  • Método finalize() da classe Object;
    • protected void finalize();
    • Pertence à classe Object (classe que é a base de cada hierarquia de classes em um projeto Java);
    • É chamado pelo Garbage Collector para um objeto quando o processo Garbage Collection determina que não há mais referências para esse objeto;
  • Método gc() da classe System;
    • public static void gc();
    • Pertence à classe System;
    • Força chamar o Garbage Collector;
    • Chamar esse método sugere que a JVM envie esforços para a reciclagem de objetos não utilizados, a fim de tornar a memória que eles atualmente ocupam disponível para reutilização rápida
    • Nada garante que ele realmente vá coletar lixo naquele momento, mesmo tentando “forçar” a coleta de lixo.

Há a possibilidade do programador chamar o gabarge collector, mas mesmo assim, não há garantia de que este irá realmente ser executado no momento que é chamado.

Vamos entender como um objeto é elegível para ser coletado. Vejam o primeiro trecho de código em Java:

1. Classe a;

2. Classe b;

3. Classe c;

4. a = new Classe(“A”);

5. b = a;

6. c = new Classe(“C”);

No trecho acima, temos três variáveis-objeto (a, b e c) do tipo da Classe. Essas variáveis-objeto ficam na Stack Memory.

Na linha 4, a primeira variável-objeto a recebe a referência do objeto recém-criado a partir do operador new seguido do construtor da classe passando o parâmetro “A”.

Esse novo objeto fica na Young Generation lá há Heap Space.

Na linha 5, a variável-objeto b vai apontar para o mesmo objeto que a variável-objeto a está apontando. Então o objeto possui duas referências.

Na linha 6, a variável-objeto c possui seu próprio objeto, também recém-criado a partir do operador new seguido do construtor da classe passando o parâmetro “C”. Esse objeto, também na na Young Generation lá há Heap Space, tem apenas uma referência.

Diagrama

Descrição gerada automaticamente

Figura 2: Variáveis-objeto referenciando objetos.

Vamos para o segundo trecho de código em Java que complementa o primeiro:

1. b = null;

2. c = new Classe(“D”);

Na linha 1 do segundo trecho, a variável-objeto b, deixa de apontar para o objeto “A”, mas a variável-objeto a ainda aponta para esse objeto.

Na linha 2, a variável-objeto c deixou de apontar o objeto “C” e agora aponta para um objeto recém-criado a partir do operador new seguido do construtor da classe passando o parâmetro “D”, ou seja, o objeto “C” fica órfão de referência e solto na Young Generation lá há Heap Space.

Com isso, o objeto “C”, sem referência, vira elegível para ser coletado.

Interface gráfica do usuário

Descrição gerada automaticamente

Figura 3: Variáveis-objeto referenciando objetos.

Espero que tenham gostado! 

Forte abraço e até a próxima jornada!

_________________________

Professor Rogerão Araújo

Quer ficar por dentro dos concursos públicos abertos e previstos pelo Brasil?
clique nos links abaixo:

Concursos Abertos

Concursos 2024

Receba gratuitamente no seu celular as principais notícias do mundo dos concursos!
clique no link abaixo e inscreva-se gratuitamente:

Telegram

Por
2 min. de leitura