O que é o Java Garbage Collector?
O coletor de lixo é um encadeamento daemon que libera memória durante o tempo de execução. A coleta de lixo também pode ser expressa como reciclagem de memória. Principalmente na JVM, o coletor de lixo do hotspot da oracle é usado devido à sua eficiência. A área de memória na JVM onde os objetos são criados é chamada heap. O heap é dividido em duas partes:
- Espaço de geração jovem
- Espaço de geração antigo / seguro
A geração jovem é novamente dividida em 3 partes
- Eden space
- Sobrevivente De
- Survivor To
Uma explicação mais profunda foi dada nos próximos pontos. Por exemplo, se você criou um cache no seu programa e se o objeto de cache sobreviveu a muitos ciclos do GC, ele será transferido para a geração antiga. O GC procura objetos que não são mais necessários pelo programa e os destrói.
Por que coletor de lixo?
Antes do Java, duas das linguagens mais populares eram C e C ++. Em C, encontramos calloc (), malloc (), realloc () que alocará memória buffer e em C ++ temos destruidores. Todas essas funções são para o recurso chamado gerenciamento de memória. Java fornece o coletor de lixo como gerenciamento automático de memória pelos dois principais motivos:
- Alguns objetos criados se tornam inacessíveis
- As referências de objetos antigos para objetos jovens existem apenas em pequenos números.
A melhor prática para usar um coletor de lixo é configurar sinalizadores na JVM.
Deixe-me dar um exemplo para objetos inacessíveis
//class code
int i = 1;
if(i == 1)(
String s = abc;
System.out.println(s);
)
//class code
No exemplo acima, Java criará um objeto de sequência e o escopo desse objeto será apenas se o bloco não puder ser usado fora. Portanto, quando a coleta de lixo for executada sobre essa classe, ela marcará 's' como objeto inacessível e não utilizado e a excluirá.
Funções no coletor de lixo
- Marcar: inicia no nó raiz do seu aplicativo (principal), percorre o gráfico de objetos, marca objetos que podem ser acessados como vida.
- Excluir / varrer: exclua objetos inacessíveis. Quando o GC exclui objetos, ele cria um buraco na pilha, tornando-o inconsistente. Assim, a compactação é usada.
- Compactação: compacte a memória movendo-se pelos objetos e marcando a alocação contígua e fragmentada. É uma tarefa demorada.
Como o Java Garbage Collector funciona?
- Existem dois tipos de objetos:
Objetos ao vivo: alcançáveis (referências de outro objeto)
Objetos mortos: inacessíveis (não referenciados de qualquer lugar)
- Todos os objetos recém-criados são criados no espaço Eden (espaço Young Generation).
- Quando o espaço Eden estiver cheio, um programa minorGC () será executado no espaço Young Generation, que marca todos os objetos não utilizados ou mortos e os varre da memória.
- Os objetos que sobreviveram a este ciclo de GC serão movidos para o Survivor From space. O mesmo processo se repete e, desta vez, quando os objetos são movidos do espaço Eden para o Survivor Do espaço, o GC verifica se está cheio, os objetos mortos são liberados e os objetos sobreviventes também serão movidos para o Survivor.
- Esse processo é repetido e, como alguns objetos sobreviveram a um limite no de ciclos de GC, esses objetos são movidos para o espaço Old Generation.
- Nesse cenário, a JVM executa a função majorGC () que executa todo o espaço de heap, identifica / marca objetos não utilizados (nulos ou mortos) e varre todos esses objetos.
- Lembre-se de que varrer objetos do espaço da pilha criará buracos na memória, causando um vazamento de memória. Para evitar esse cenário, o coletor de lixo implementa a compactação do espaço na memória
Exemplos de coletor de lixo em Java
Exemplo de system.gc ():
class Demo (
public void finalize()(
System.out.println(“Object”);
)
public static void main(String args())(
Demo obj1 = new Demo();
Demo obj2 = new Demo();
obj1 = null;
obj2 = null;
System.gc();
)
)
Resultado:
Objeto
Explicação do código acima
- No código acima, os dois objetos obj1 e obj2 estão apontando para nulo, para que sejam armazenados no espaço Eden com valores nulos e não referenciados
- O sistema gc () invocará um encadeamento daemon de coleta de lixo e os dois objetos serão excluídos do espaço.
Prós e contras
Abaixo estão alguns prós e contras do Java Garbage Collector, como a seguir:
Prós do gc:
- A coleta de lixo aumenta a eficiência da memória, pois excluirá todos os objetos nulos e não utilizados
- Um coletor de lixo é um processo automático, portanto, o desenvolvedor pode não cuidar dele, porque em outros idiomas sem um programador de coletor de lixo é necessário cuidar de um problema de memória indescritível.
Contras de gc:
- O coletor de lixo executará a principal função gc, que percorrerá todo o espaço da pilha, fazendo o programa acelerar lentamente por alguns segundos.
- Esse processo levará mais tempo de CPU, tornando o sistema de código mais lento.
- Se você estiver trabalhando em um aplicativo que requer muita memória, use os sinalizadores da JVM disponíveis.
- Se o espaço da pilha estiver cheio e os objetos não puderem ser deslizados ou adicionados mais, o Java lançará um erro de memória, o que desacelerará o aplicativo inteiro e também pode causar vazamentos de memória.
Artigos recomendados
Este é um guia para O que é o Java Garbage Collector? Aqui discutimos seu trabalho junto com Funções, exemplo, prós e contras do coletor de lixo Java. Você também pode consultar os seguintes artigos para saber mais:
- Construtor e Destrutor em Java
- Destruidor em Java
- C # vs desempenho Java
- O que é a JVM?