Um dos problemas mais difíceis de identificar em aplicações JavaScript são os memory leaks.

Eles não quebram o código imediatamente, mas fazem a aplicação:

  • ficar lenta com o tempo
  • consumir memória demais
  • travar ou recarregar inesperadamente

🎯 Objetivo da aula

Ao final desta aula, você será capaz de:

  • Entender o que são memory leaks
  • Identificar causas comuns
  • Evitar referências desnecessárias
  • Escrever código mais seguro e sustentável

O que é um memory leak?

Um memory leak acontece quando:

objetos que não são mais necessários continuam ocupando memória.

Em JavaScript, isso ocorre quando o Garbage Collector não consegue liberar um objeto, porque ainda existe alguma referência a ele.

Importante: o problema não é o Garbage Collector

O Garbage Collector funciona muito bem.

O problema geralmente é:

  • referências mantidas sem necessidade
  • listeners esquecidos
  • closures mal usados

Causa 1 — Event listeners não removidos

Veja este exemplo:

 const botao = document.querySelector("#btn");

function aoClicar() {
console.log("Clicou!");
}

botao.addEventListener("click", aoClicar);

Se esse botão for removido do DOM:

  • o listener continua na memória
  • a função não é liberada

✅ Correto:

 botao.removeEventListener("click", aoClicar); 

Causa 2 — Closures mantendo referências

Closures são poderosos — e perigosos se mal usados.

 function criarContador() { let contador = 0;

return function () {
contador++;
console.log(contador);
};
}

const contar = criarContador();

Aqui:

  • a variável contador nunca é liberada
  • enquanto contar existir
Isso não é errado — mas precisa ser intencional.

Causa 3 — Variáveis globais desnecessárias

Variáveis globais vivem durante toda a execução da aplicação.

❌ Evite:

 let dados = [];

function carregar() {
dados.push(new Array(1000000));
}

Esse array nunca será liberado.

Causa 4 — Timers esquecidos

Timers também mantêm referências.

 setInterval(() => { console.log("Executando..."); }, 1000); 

Se não forem cancelados:

  • continuam rodando
  • mantêm funções vivas

✅ Correto:

 const id = setInterval(() => { console.log("Executando..."); }, 1000);

clearInterval(id);

Causa 5 — Estruturas que crescem sem controle

Exemplo clássico:

 const cache = [];

function adicionar(item) {
cache.push(item);
}

Se nunca limpar:

  • a memória cresce indefinidamente
Caches precisam de estratégia de descarte.

Boas práticas para evitar memory leaks

  • remova event listeners quando não precisar mais
  • limpe timers (clearTimeout, clearInterval)
  • evite variáveis globais
  • tenha cuidado com closures longas
  • libere referências explicitamente quando possível

Uso consciente de WeakMap e WeakSet

Como vimos anteriormente:

  • WeakMap e WeakSet ajudam a evitar vazamentos
  • não impedem o Garbage Collector
Eles são aliados importantes em aplicações complexas.

Ferramentas de diagnóstico

Você pode investigar memory leaks usando:

  • DevTools → Memory
  • Heap snapshots
  • Performance monitor

Mas o melhor diagnóstico ainda é:

código bem pensado.

Resumo da aula para nunca mais esquecer

  • Memory leaks consomem memória silenciosamente
  • São causados por referências desnecessárias
  • Listeners, timers e closures são vilões comuns
  • Boas práticas evitam problemas futuros
  • Código consciente é código saudável

Na próxima aula, vamos fechar esse bloco com um tema crítico: Segurança no JavaScript (XSS).


HARDWARE

Entendendo o seu computador

O que há dentro do meu computador?

Existem alguns componentes fundamentais presentes dentro do seu computador e é muito importante que você conheça um pouco sobre eles, seja para argumentar com algum vendedor durante a compra de um novo PC ou para identificar alguma atitude desleal de algum técnico que esteja te passando um orçamento para reparo. Na seção Raio-X aqui do Contém Bits você pode conhecer e entender mais detalhadamente sobre cada componente, ou também pode clicar abaixo no componente que deseja, para conhecê-lo melhor.

  • Gabinetes

  • Placas-Mãe

  • Processadores

  • Memória

  • Fontes

  • Drives Ópticos

  • Discos Rígidos

  • SSD

  • Placas de Som

  • Placas de Vídeo

Você Sabia?

O mouse foi criado em 9 de dezembro de 1968, por um americano chamado Douglas Engelbart, que o batizou de "XY Position Indicator for a Display System". Conheça a história do mouse clicando aqui.


Desde o seu lançamento, em 1985, o fantástico jogo Tetris vende pelo menos 70 milhões de unidades por ano em todo o mundo! Os dados são oficiais e fornecidos pela THQ, uma das distribuidoras do título.


A empresa Take-Two pagou à Infogrames mais de 22 milhões de dólares pelos direitos de Civilization, em novembro de 1994. Ainda sobre este título, Sid Meier, um dos seus fundadores, é o profissional da área dos games mais premiado em todo o mundo.


O épico jogo River Raid, do Atari, foi desenhado e boa parte de sua programação foi feita por uma mulher: Carol Shaw, uma excelente programadora e funcionária da Activision em 1982. Saiba mais sobre a história deste incrível jogo, aqui.


A partida mais longa do clássico Space Invaders durou incríveis 38 horas e 32 minutos e esta façanha foi conseguida por um jogador de apenas 12 anos! O jogo, claro, podia ser pausado para alimentação e descanso, mas ainda assim o recorde, estabelecido no dia 02/09/1980, ainda não foi quebrado. Saiba mais.