Sobes.tech
Middle+

Quais são as características do coletor de lixo em Dart?

sobes.tech IA

Resposta da IA

O recolhedor de lixo em Dart usa o algoritmo de Recolha de Lixo Generacional (Generational Garbage Collection).

Características principais:

  • Gerações: Os objetos são divididos em duas gerações:
    • Geração jovem: Aqui, são criados novos objetos. A recolha nesta geração é mais rápida e frequente, pois a maioria dos objetos morre pouco depois de serem criados.
    • Geração antiga: Os objetos que sobrevivem a vários ciclos de recolha na geração jovem são movidos para aqui. A recolha nesta geração é menos frequente, mas leva mais tempo.
  • Sobreviventes: Os objetos na geração jovem aos quais outros objetos fazem referência são considerados "sobreviventes" e podem ser movidos para a geração antiga.
  • Etapas de recolha:
    • Recolha na geração jovem (Minor GC): Recolha rápida que afeta apenas os objetos na geração jovem.
    • Recolha na geração antiga (Major GC): Recolha mais longa que verifica os objetos na geração antiga.
  • Vantagens da recolha generacional:
    • Otimização para objetos de curta duração: A maior parte do lixo é eliminada rapidamente da geração jovem.
    • Redução do tempo de pausa: Pausas frequentes, mas curtas, para a recolha na geração jovem, são menos perceptíveis do que pausas raras, mas longas, para toda a memória.
  • Recolhedor de lixo do Dart VM:
    • Usa uma abordagem híbrida que combina cópia (coping collector) para a geração jovem e marcação e compactação (mark-and-sweep/compact) para a geração antiga.
    • O recolhedor de cópia na geração jovem move rapidamente os objetos vivos para outra área de memória, libertando eficientemente a atual.
    • A marcação e compactação na geração antiga encontra os objetos vivos e depois os move para eliminar a fragmentação de memória.
    • Funciona independentemente dos threads da interface de utilizador, minimizando bloqueios.
// Exemplo de criação de objetos que serão colocados na geração jovem
class MyClass {
  String name;
  MyClass(this.name);
}

void main() {
  var obj1 = MyClass("Objeto 1"); // Criado na geração jovem
  var obj2 = MyClass("Objeto 2"); // Criado na geração jovem

  // Se os objetos não forem mantidos por referências, podem ser recolhidos
  // durante a próxima recolha na geração jovem.

  // Se estes objetos viverem muito tempo e tiverem referências a eles,
  // podem ser transferidos para a geração antiga.
}