Introdução ao Garbage Collector

  O Garbage Collector (Coletor de Lixo ou popularmente conhecido como Gari) é um componente fundamental em linguagens de programação modernas, incluindo Ruby. Tem como papel crucial no desempenho a gerência automática de memória, permitindo que os desenvolvedores se concentrem na lógica de seus programas em vez de se preocuparem com…

  O Garbage Collector (Coletor de Lixo ou popularmente conhecido como Gari) é um componente fundamental em linguagens de programação modernas, incluindo Ruby. Tem como papel crucial no desempenho a gerência automática de memória, permitindo que os desenvolvedores se concentrem na lógica de seus programas em vez de se preocuparem com alocação e desalocação de memória manualmente. Vamos explorar o funcionamento do Garbage Collector em Ruby e sua importância para o desenvolvimento de aplicativos eficientes e robustos.

Ruby é uma linguagem de programação dinâmica e orientada a objetos conhecida por sua simplicidade e facilidade de uso. No entanto, essa simplicidade não isenta os desenvolvedores da responsabilidade de gerenciar a memória adequadamente. A alocação de memória para objetos em Ruby é uma operação automática, graças ao recurso conhecido como “gerenciamento de memória automático” ou “coleta de lixo”.

Aqui estão alguns conceitos-chave:

Alocação de Memória
  Sempre que você cria um objeto em Ruby, a memória é alocada dinamicamente para ele. Por exemplo, ao criar uma nova instância de uma classe, como objeto = MinhaClasse.new, a memória é reservada para armazenar esse objeto.

Referências
  Referências são variáveis ou estruturas de dados que mantêm uma ligação para um objeto.O GC tem como objetivo acompanhar as referências para cada objeto, assim, quando um objeto não tiver mais referências, ele se torna inacessível e elegível para coleta de lixo. 

Ciclo de Vida de um Objeto
  O ciclo de vida de um objeto em Ruby envolve sua criação, uso e, eventualmente, sua desalocação. O Garbage Collector entra em cena quando não há mais referências para um objeto, liberando a memória ocupada por ele.

Coleta de Lixo
  O Garbage Collector identifica objetos sem referências e os remove da memória. Isso ocorre automaticamente em segundo plano, sem a intervenção do programador. Ruby utiliza um algoritmo de coleta de lixo chamado “Mark and Sweep” (Marcar e Varrer) para realizar essa tarefa.

GC Tuning
  Em alguns casos, você pode precisar ajustar o comportamento do Garbage Collector para otimizar o desempenho do seu programa. Ruby oferece opções de configuração para fazer isso, como definir limites para a memória usada ou a frequência da coleta de lixo. (Veremos na Parte II)

O que é “Mark and Sweep” ?

  “Mark and sweep” é um algoritmo utilizado em sistemas de gerenciamento de memória, especialmente em linguagens de programação que não oferecem suporte direto à alocação e desalocação de memória, como C e C++. Esse algoritmo é usado para recuperar e liberar memória que não está mais sendo utilizada por um programa para evitar vazamentos de memória.

  • E como ele funciona?
     O processo envolve duas fases distintas. Para liberar a memória usada por um objeto, Ruby primeiro precisa ter certeza de que o objeto não é mais necessário. Isso é feito em várias passagens. Na fase de “marcação” (Mark), a ação é de rastrear todos os objetos e marcar aqueles que ainda estão em uso. Isso é feito alternando um sinalizador em um bitmap livre. Em seguida vem a fase de “varredura” (Sweep), nessa fase o sistema percorre todos os objetos novamente, limpa os objetos não marcados e os retorna para a lista livre. Ele faz isso apenas manipulando os ponteiros, então é bem rápido.

Em resumo, o Garbage Collector é um mecanismo de gerenciamento de memória automático que monitora e remove objetos não referenciados, liberando memória de forma eficiente e é essencial para evitar vazamentos de memória e garantir que seu programa utilize eficazmente os recursos do sistema. Embora ele funcione automaticamente na maioria dos casos, é importante entender seus princípios de funcionamento para evitar problemas de desempenho e memória em aplicativos mais complexos.

Próxima Parte (II):

  • Ajustes práticos do Garbage Collector em Ruby


Referências: 

0 Comentário