Ruby: coleta de lixo
O curso trata de ferramentas para observar e conduzir o coletor de lixo do Ruby nos seus próprios objetos. O ObjectSpace.each_object conta as instâncias vivas de uma classe, e o ObjectSpace.count_objects divide o heap por tipo interno. O GC::Profiler registra cada pausa do GC com a duração em milissegundos. Duas variáveis de ambiente RUBY_GC_* são testadas no Ruby 4.0.1: uma tem efeito mensurável, e a outra está obsoleta. Também entram os finalizers, com a armadilha de se referir ao objeto sendo finalizado, e o WeakRef, uma referência que o GC não conta.
O que você vai aprender
- ✓Contar objetos vivos de uma classe com ObjectSpace.each_object
- ✓Comparar fotos do heap por tipo com ObjectSpace.count_objects
- ✓Medir pausas do GC com o GC::Profiler
- ✓Testar variáveis de ambiente do GC na sua versão do Ruby
- ✓Escrever finalizers que não guardam referência ao self
- ✓Usar WeakRef para referências que o GC não conta
Contando objetos vivos com ObjectSpace
A aula "Gerenciamento de memória", de Fundamentos de OS, cobriu o modelo do heap com slots, o mark and sweep, o GC geracional e os campos heap_allocated_pages/heap_live_slots/count do GC.stat. Ela também cobriu find_each e literais de string congelados como padrões de memória no Rails. Nada disso…
Ler a aula completa grátis →Currículo
7 aulasContando objetos vivos com ObjectSpace
Como contar instâncias vivas de uma classe com ObjectSpace.each_object e por que a contagem crua precisa de uma base.
O que ObjectSpace.count_objects revela
Ler o heap por tipo interno com ObjectSpace.count_objects e comparar fotos tiradas antes e depois do código suspeito.
GC::Profiler: vendo as pausas acontecerem
Registrar pausas do GC com GC::Profiler, ler a tabela do relatório e limitar a medição ao código suspeito.
Ajustando o heap com variáveis de ambiente do GC
Testar RUBY_GC_HEAP_GROWTH_FACTOR, que muda o número de execuções do GC, e RUBY_GC_HEAP_INIT_SLOTS, obsoleta no Ruby 4.0.1.
Finalizers e o objeto que você não pode tocar
Agendar código com ObjectSpace.define_finalizer e entender por que um finalizer que guarda o self não roda no GC.start.
WeakRef: uma referência que não conta
Usar WeakRef como referência que o GC ignora, ver o objeto ser coletado e aplicar isso a caches.
Juntando tudo
Uma revisão das cinco ferramentas e do motivo de o curso não ter desafio de código.