Skip to content
Latchkey

O que é um Memory Leak? Memória que nunca volta

Um memory leak acontece quando um programa retém memória de que não precisa mais, fazendo seu uso de memória crescer ao longo do tempo até acabar.

Um memory leak não é um crash dramático no início; é uma subida lenta. O programa continua alocando memória e nunca solta parte dela, então o uso sobe aos poucos. Eventualmente o processo esgota a memória disponível e trava ou é morto. Leaks acontecem tanto em linguagens de memória manual (você esquece de liberar) quanto nas com garbage collection (você mantém uma referência viva).

O que um leak realmente é

Um leak é memória que continua alocada mas nunca mais será usada ou liberada. Em linguagens manuais é uma alocação sem um free correspondente; em linguagens com garbage collection é um objeto que o collector não consegue recuperar porque algo ainda o referencia.

Causas comuns

  • Caches ou listas crescentes que nunca são reduzidos.
  • Event listeners ou subscriptions que são adicionados mas nunca removidos.
  • Closures que capturam e retêm objetos grandes.
  • Registries globais que acumulam entradas ao longo da vida do programa.

Por que leaks são traiçoeiros

Um leak raramente quebra algo imediatamente. Um programa de vida curta pode terminar antes de o leak importar. Um servidor de longa duração, porém, vai se degradar lentamente e acabar caindo, muitas vezes horas depois de o código problemático ter rodado.

Encontrando leaks

Heap snapshots e memory profilers mostram quais objetos continuam crescendo e o que mantém referências a eles. Acompanhar a memória ao longo de uma execução longa e então procurar uma tendência de alta constante é a forma usual de confirmar que existe um leak.

Um exemplo rápido

Empurrar itens para um array em nível de módulo a cada request, sem nunca removê-los, causa leak de memória: o array cresce para sempre e nada do que ele guarda pode ser coletado, mesmo que esses itens nunca sejam lidos de novo.

Memory leaks no CI

Uma suíte de testes com leak pode cruzar o limite de memória do runner e ser OOM-killed, muitas vezes só em execuções grandes, o que parece uma falha flaky. Runners maiores (Latchkey) adiam o sintoma e fazem retry automático de OOM kills transitórios, mas um leak persistente ainda precisa ser corrigido, já que mais memória apenas posterga o crash.

Principais conclusões

  • Um memory leak é memória alocada que nunca é liberada, então o uso cresce ao longo do tempo.
  • Leaks acontecem em linguagens manuais e com garbage collection, muitas vezes via referências remanescentes.
  • No CI eles aparecem como OOM kills, frequentemente confundidos com falhas flaky.

Guias relacionados