Sobes.tech
Middle

O que sabes sobre o coletor de lixo em Dart?

sobes.tech IA

Resposta da IA

O Dart usa um coletor de lixo de thread único baseado na recolha generacional.

Características principais:

  • Recolha generacional: Os objetos são divididos em duas gerações:
    • Geração jovem: Objetos novos e de curta duração. São recolhidos frequentemente.
    • Geração antiga: Objetos de longa duração que sobreviveram a várias recolhas na geração jovem. São recolhidos com menos frequência.
  • Stop-the-World: Para realizar a recolha de lixo, é necessário suspender a execução do programa (Dart Isolates). No entanto, graças à unidirecionalidade e otimizações, os atrasos são mínimos.
  • Marcar e varrer: Na geração antiga, é usado o algoritmo Mark-and-Sweep. Primeiro, os objetos acessíveis são marcados, depois os inalcansáveis são removidos. Para a geração jovem, é usado o algoritmo Copying Collector, que move rapidamente os objetos vivos para outro espaço de memória.
  • Sem ciclos na recolha de lixo: O desenvolvedor não precisa de gerir manualmente a memória nem de chamar o GC. O sistema faz isso automaticamente.
  • Otimizações: Incluem inlining de funções, especialização de tipos e alocação de objetos na pilha, o que reduz a carga no coletor de lixo.

Por exemplo, ao criar um novo objeto:

// Criação de um novo objeto na "geração jovem" de memória
var myObject = MyClass();

Se myObject permanecer na memória e acessível durante muito tempo, eventualmente será movido para a "geração antiga". Se deixar de ser acessível, o coletor de lixo libertá-lo-á eventualmente.

// myObject agora não é acessível, pode ser recolhido pelo coletor de lixo
myObject = null;

É importante entender que o coletor de lixo do Dart é eficiente, mas não é uma cura para fugas de memória, que podem ocorrer devido à manutenção de referências fortes a objetos que já não são necessários (por exemplo, subscrições não canceladas).