Middle
Fale sobre os métodos de recolha de lixo (Garbage Collector).
sobes.tech IA
Resposta da IA
Métodos de recolha de lixo:
- Contagem de referências (Reference Counting): Cada objeto mantém um contador de referências a si próprio. Quando o contador chega a zero, o objeto é considerado lixo e removido.
- Vantagens: Simples, não bloqueia a execução principal por muito tempo.
- Desvantagens: Não lida com referências cíclicas; requer espaço adicional para o contador em cada objeto.
- Coletores de lixo de rastreamento (Tracing Garbage Collectors): Começam com um conjunto de objetos "raiz" (por exemplo, variáveis ativas, pilha de chamadas) e percorrem recursivamente todos os objetos acessíveis a partir dessas raízes. Objetos inacessíveis são considerados lixo.
- Estratégias principais de rastreamento:
- Marcar e varrer (Mark and Sweep):
- Marcar (Mark): Percurso do grafo de objetos, marcando todos os objetos acessíveis.
- Varrer (Sweep): Segundo percurso na memória, removendo todos os objetos não marcados.
- Desvantagens: Fragmentação de memória.
- Marcar e compactar (Mark and Compact):
- Marcar (Mark): Como em Mark and Sweep.
- Compactar (Compact): Move os objetos vivos para que fiquem em posições contíguas, eliminando a fragmentação.
- Desvantagens: Mais complexo, pode requerer parar a execução do programa.
- Copiar (Copying): Divide a memória em duas áreas (semi-espacos). Em cada ciclo de recolha, os objetos vivos de uma área são copiados para a outra. Depois, a área antiga é completamente limpa.
- Vantagens: Sem fragmentação, alocação rápida de memória após a recolha.
- Desvantagens: Requer o dobro de memória em relação à memória ativa.
- Marcar e varrer (Mark and Sweep):
- Estratégias principais de rastreamento:
- Recolha de lixo generacional (Generational Garbage Collection): Baseada na hipótese de que a maioria dos objetos não vive muito tempo. A memória é dividida em gerações (jovem, antiga). Os objetos são colocados na geração jovem na sua criação. Se um objeto sobrevive a várias recolhas na geração jovem, é movido para a geração antiga. A recolha ocorre com mais frequência na geração jovem.
- Vantagens: Eficiente, pois a maior parte do trabalho é feita na geração jovem com poucos dados.
- Desvantagens: Requer rastreamento de referências das gerações antigas para as jovens (cartões de registro ou outros mecanismos).
Exemplos de linguagens e seus GC:
- Python: Contagem de referências (com recolha cíclica para referências cíclicas).
- Java, C#: Generacional, Marcar e varrer, Marcar e compactar, Copiar (vários métodos e combinações dependendo da versão e configurações específicas da JVM/.NET).
- Go: Concorrente, não generacional, Marcar e varrer com otimizações.