Lembre-se do que é coleta de lixo em Java
A coleta de lixo é o processo de recuperar toda a memória de tempo de execução, destruindo objetos não utilizados.
Às vezes, o programador pode esquecer de destruir objetos inúteis e a memória alocada para eles não é liberada. Mais e mais memória do sistema é consumida e, eventualmente, não há mais alocação. Esses aplicativos sofrem de “vazamentos de memória”.
Depois de um certo ponto, não há mais memória suficiente para criar novos objetos e o programa é encerrado de forma anormal devido a OutOfMemoryError .
A coleta de lixo em Java é o processo pelo qual os programas Java gerenciam a memória automaticamente. Os programas Java são compilados em bytecode que é executado na Java Virtual Machine (JVM).
Quando os programas Java são executados na JVM, os objetos são criados no heap, que é a parte da memória alocada para eles.
Enquanto um aplicativo Java está em execução, novos objetos são criados nele. No final, alguns objetos não são mais necessários. Podemos dizer que, a qualquer momento, a memória heap consiste em dois tipos de objetos.
- Live - Esses objetos são usados, eles são referenciados de algum outro lugar.
- Morto - esses objetos não são usados em nenhum outro lugar, não há referências a eles.
O coletor de lixo localiza esses objetos não utilizados e os remove para liberar memória.
A coleta de lixo em Java é um processo automático . O programador não precisa marcar explicitamente os objetos a serem excluídos.
Cada JVM pode implementar sua própria versão de coleta de lixo. No entanto, o coletor deve estar em conformidade com a especificação JVM padrão para lidar com objetos presentes na memória heap para marcar ou identificar objetos inacessíveis e destruí-los por meio de compactação.
Acessibilidade do objeto
Para reconhecer um objeto como vivo, a presença de links não é suficiente. Isso ocorre porque alguns objetos mortos podem se referir a outros objetos mortos. Por isso é necessário que entre todas as referências a um objeto, haja pelo menos uma de um objeto “vivo”.
Os coletores de lixo trabalham com o conceito de GC Roots ( raízes de coleta de lixo ) para distinguir entre objetos vivos e mortos. Existem objetos 100% vivos e a partir deles existem links que animam outros objetos e assim por diante.
Exemplos de tais raízes:
- Classes que são carregadas pelo carregador de classes do sistema.
- Transmissões ao vivo.
- Parâmetros de métodos atualmente em execução e variáveis locais.
- Objetos que são usados como um monitor para sincronização.
- Objetos que são retidos da coleta de lixo para algum propósito.
- O coletor de lixo percorre todo o gráfico de objetos na memória, começando nessas raízes e seguindo as referências a outros objetos.
Etapas de coleta de lixo em Java
A implementação da coleta de lixo padrão tem três etapas.
1. Marcar objetos como ativos
Neste ponto, o coletor de lixo (GC) deve identificar todos os objetos vivos na memória percorrendo o grafo do objeto.
Quando visita um objeto, marca-o como disponível e, portanto, vivo. Todos os objetos que não são acessíveis pelas raízes do GC são considerados candidatos à coleta de lixo.
2. Limpando objetos mortos
Após a fase de marcação, o espaço de memória é ocupado por objetos vivos (visitados) ou mortos (não visitados). A fase de limpeza libera os fragmentos de memória que contêm esses objetos mortos.
3. Disposição compacta dos objetos restantes na memória
Não é necessário que os objetos mortos que foram removidos na fase anterior estejam próximos uns dos outros. Assim, você corre o risco de obter um espaço de memória fragmentado (meio vazio).
Mas, claro, tendo previsto isso, é possível compactar a memória no momento em que o coletor de lixo remove os objetos mortos. O restante estará localizado em um bloco contíguo no início do heap.
O processo de compactação facilita a alocação sequencial de memória para novos objetos.
GO TO FULL VERSION