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:
WeakMapeWeakSetaceitam 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
WeakMapou os elementos de umWeakSet(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().
