Sobes.tech
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):
        1. Marcar (Mark): Percurso do grafo de objetos, marcando todos os objetos acessíveis.
        2. 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):
        1. Marcar (Mark): Como em Mark and Sweep.
        2. 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.
  • 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.