Sobes.tech
Middle+

Como lida com fugas de memória, se ocorrerem?

sobes.tech IA

Resposta da IA

Para detectar e corrigir fugas de memória, utilizo os seguintes métodos:

  1. Monitorização: Acompanho regularmente o consumo de memória usando ferramentas integradas do Node.js, como --expose-gc, process.memoryUsage(), ou ferramentas externas como PM2 ou Prometheus/Grafana.
  2. Ferramentas de profiling:
    • Instantâneas do heap: Tiro "instantâneas do heap" em diferentes momentos usando Chrome DevTools (ou qualquer outro depurador que suporte o protocolo V8) e comparo-as para identificar objetos que crescem com o tempo e não deveriam.
    // Exemplo de uso de heapdump para criar uma instantânea do heap
    const heapdump = require('heapdump');
    
    // ... seu código ...
    
    // Criar uma instantânea do heap
    heapdump.writeSnapshot((err, filename) => {
        if (err) console.error(err);
        else console.log('Instantânea do heap guardada em:', filename);
    });
    
    • Profiling de CPU: Às vezes, fugas não estão diretamente relacionadas com a memória, mas com ciclos infinitos ou uso excessivo de CPU, o que pode indiretamente causar problemas de memória.
  3. Análise do código: Reviso manualmente o código em busca de causas comuns de fugas:
    • Manipuladores de eventos não removidos.
    // Exemplo de fuga: manipulador de evento não removido
    const EventEmitter = require('events');
    const emitter = new EventEmitter();
    
    function handler() { /* ... */ }
    
    emitter.on('myEvent', handler);
    
    // Se o emissor continuar a existir e a referência ao manipulador se perder
    // ou o objeto ao qual está ligado precisar ser destruído,
    // o manipulador irá mantê-lo na memória.
    
    // Correto:
    // emitter.off('myEvent', handler);
    
    • Temporizadores não limpos (setInterval, setTimeout).
    • Closures que acidentalmente mantêm referências a objetos grandes.
    • Variáveis globais que não são limpas.
    • Caches que crescem indefinidamente sem mecanismo de expulsão.
    • Promessas ou callbacks esquecidos que mantêm o contexto na memória.
  4. Testes automatizados: Escrevo testes que simulam o funcionamento a longo prazo da aplicação e verificam a estabilidade do consumo de memória.
  5. Revisões de código: Peço aos colegas que analisem o código em busca de potenciais fugas.