Existem dois tipos principais de algoritmos de coleta de lixo em Java: completa e incremental.
Coleta de lixo completa ou principal
A coleta de lixo completa é um processo no qual um coletor de lixo (uma parte do sistema de execução de uma linguagem de programação) pesquisa toda a memória usada por um programa e compila todos os objetos que não estejam mais sendo usados pelo programa. Assim, esses objetos são marcados como lixo e podem ser removidos da memória.
A coleta de lixo completa é geralmente realizada pelo sistema de execução de uma linguagem de programação que usa gerenciamento automático de memória, como Java ou Python. Durante o processo, o coletor de lixo suspende a execução do programa para realizar a pesquisa de objetos de lixo, o que pode causar uma desaceleração temporária no desempenho do programa.
A coleta de lixo completa geralmente é acionada quando a quantidade de memória usada por um programa atinge um determinado limite ou quando o programa solicita um novo bloco de memória e não há memória livre suficiente disponível. O objetivo da coleta de lixo completa é recuperar a memória que não é necessária para o programa, disponibilizando-a para uso por outras partes do programa ou por outros programas em execução na mesma máquina.
Coleta de lixo incremental ou secundária
A coleta de lixo incremental é um tipo de técnica de gerenciamento de memória usada por linguagens de programação e ambientes de execução para recuperar automaticamente a memória que não é mais necessária para um programa. Para fazer isso, ela identifica objetos na memória que não estejam em uso e libera a memória que eles ocupam para que possa ser reutilizada por outras partes do programa.
Na coleta de lixo incremental, o coletor de lixo examina periodicamente a memória do programa em busca de objetos inacessíveis na memória heap da nova geração. Em vez de interromper a execução do programa durante esse processo de verificação, o coletor de lixo divide a verificação em partes pequenas e gerenciáveis chamadas de “incrementos”. Durante cada incremento, o coletor de lixo examina uma parte da memória do programa, identificando os objetos que não são necessários e marcando-os como disponíveis para reutilização.
Ao usar incrementos, o coletor de lixo pode recuperar a memória em pequenos pedaços, sem interromper a execução do programa por um período prolongado. Isso ajuda manter o programa responsivo e evita que ele sofra pausas ou atrasos significativos em consequência do processo de coleta de lixo.
Entretanto, a coleta de lixo incremental pode ser menos eficiente do que outros tipos de técnicas de coleta de lixo, como “marcação e varredura” ou coleta de lixo geracional, pois exige verificações mais frequentes da memória do programa. Além disso, o uso de incrementos pode introduzir certa sobrecarga na execução do programa, pois o coletor de lixo precisa manter as informações de estado entre cada incremento.