Evitando Memory Leaks em JavaScript com Referências Fracas usando WeakMap e WeakSet

Evitando Memory Leaks em JavaScript com Referências Fracas usando WeakMap e WeakSet

O gerenciamento automático de memória do JavaScript pode reter objetos desnecessários quando mantemos referências fortes em estruturas como Map ou Set. O uso de WeakMap e WeakSet resolve essa retenção indevida ao criar referências fracas, permitindo que o Garbage Collector limpe os objetos da memória assim que eles ficarem inacessíveis no restante da aplicação.

JavaScript

// --- 1. Exemplo com WeakMap (Associação de metadados privados) ---
const metadadosUsuarios = new WeakMap();

let usuarioLogado = { id: 101, nome: 'Carlos' };

// Associa dados auxiliares ao objeto do usuário sem alterá-lo diretamente
metadadosUsuarios.set(usuarioLogado, { ultimoAcesso: new Date(), ip: '192.168.1.1' });

console.log('Metadados do Usuário:', metadadosUsuarios.get(usuarioLogado));

// Se a referência 'usuarioLogado' for anulada, o Garbage Collector elimina a chave e o valor do WeakMap
usuarioLogado = null; 


// --- 2. Exemplo com WeakSet (Rastreamento de instâncias/estados) ---
const conexoesAtivas = new WeakSet();

let conexaoServidor = { id: 'socket_99', status: 'conectado' };

// Adiciona o objeto ao conjunto de rastreamento
conexoesAtivas.add(conexaoServidor);

console.log('Conexão está ativa?:', conexoesAtivas.has(conexaoServidor)); // true

// Ao desconectar e limpar a referência, o objeto é liberado da memória automaticamente
conexaoServidor = null;

Pontos-chave

  • Apenas Chaves do Tipo Objeto: WeakMap e WeakSet aceitam estritamente objetos (e símbolos não registrados) como chaves/elementos; tipos primitivos como strings ou números disparam erro.
  • Chaves Não Iteráveis: Não é possível listar as chaves de um WeakMap ou os elementos de um WeakSet (métodos como .keys(), .values() ou .forEach() não existem), pois o estado da memória é não determinístico.
  • Prevenção Real de Memory Leaks: Ideal para vincular dados a elementos do DOM, criar cache de objetos temporários ou rastreá-los sem impedir a coleta de lixo.
  • Interface Enxuta: Disponibilizam apenas métodos essenciais de manipulação direta, como .get(), .set(), .has() e .delete().

Thales de Oliveira Gomes

Thales de Oliveira Gomes é gestor de Tecnologia da Informação, especialista em infraestrutura de redes, computação em nuvem e operações de TI hospitalar, com mais de 18 anos de experiência na área. Graduado em Gestão de TI e pós-graduado em Engenharia de Redes e Telecomunicações, Cloud Computing, Redes de Computadores e Gestão Hospitalar, construiu uma trajetória sólida liderando projetos de alta complexidade, como a implementação e migração para nuvem de sistemas ERP de grande porte. Sua atuação no setor o levou a ser indicado ao prêmio IT Leaders Brasil na categoria Rising Leaders. Além da carreira corporativa e da paixão por tecnologia, Thales é autor independente com mais de 70 obras publicadas sobre redes, segurança da informação, Linux e física, além de criador de conteúdo no blog Vetor Tech e na plataforma CiberDicas. No universo das artes e do entretenimento, atua como produtor de música eletrônica sob o projeto Yknex, cria ilustrações digitais e compartilha walkthroughs de games no YouTube.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *