O JavaScript é uma linguagem com gerenciamento automático de memória. O Garbage Collector (GC) roda em background, liberando objetos que não são mais alcançáveis. Mas esse conforto tem um custo: pausas eventuais no event loop.

Como o V8 gerencia memória

O V8 divide o heap em duas gerações:

  • Young Generation: objetos recém-criados. Pequena, coleta frequente.
  • Old Generation: objetos que sobreviveram a coletas anteriores. Grande, coleta rara.
// Objetos na young generation
function process() {
  const data = { value: 42 }; // morre no fim da função
  return data.value * 2;
}

O custo das closures

Closures mantêm o escopo inteiro vivo, mesmo quando você só precisa de uma variável:

function createHandler(id) {
  return function () {
    console.log(id); // só precisa de `id`
    // mas mantém TODO o escopo vivo
  };
}

Solução: desestruturar no topo ou usar factory patterns mais enxutos.

Armadilhas comuns

  • Referências circulares em event listeners não removidos
  • Caches sem limite que crescem indefinidamente
  • Objetos temporários dentro de loops (forçam alocações)
// Ruim — aloca um array novo a cada 60ms
setInterval(() => {
  const items = [1, 2, 3, 4, 5];
  items.forEach(render);
}, 60);

// Melhor — reusa
const items = [1, 2, 3, 4, 5];
setInterval(() => items.forEach(render), 60);

GC pressure é silenciosa. Não espere o frame drop pra olhar pra ela.