Ele escreveu um pequeno post em seu canal de telegrama. Eu pensei que poderia ser de interesse para os leitores de Habr.
Recentemente, um artigo sobre o novo prozal do WeakRef (Estágio 3) - "Referências e finalizadores fracos" - apareceu no blog V8.
Tentarei explicar em minhas próprias palavras sua essência por exemplo. Imagine que você tenha algum tipo de processamento de imagem em seu navegador, por exemplo, uma marca d'água é aplicada a eles (eu concordo, o exemplo não é muito realista) e, em seguida, essas imagens são usadas de alguma forma. A marca d'água é sobreposta por uma função que consome intensamente a CPU. As imagens podem ser repetidas, portanto, para não carregar o processador novamente, criamos um cache de imagens com uma marca d'água no Map
, deixe o nome do arquivo de imagem ser a chave. Mas aqui surge um problema se alguma imagem não for usada por nós, ela ainda estará na memória, pois o Map
será a chave (referência forte). Portanto, para que o nosso Map
não consuma excesso de memória, é necessário determinar de alguma forma essas situações e limpar o cache com as mãos. Isso não é muito conveniente.
É aqui que o WeakRef vem em socorro. Usando o WeakRef, você pode criar um link fraco para uma imagem e escrevê-lo por chave, em vez da própria imagem:
const wr = new WeakRef(image); cache.set(name, wr); // const ref = cache.get(name); const image = ref.deref();
Nesse caso, o coletor de lixo poderá determinar independentemente situações em que a imagem no cache não é mais necessária e limpar a memória. Para limpar as chaves do Map na proposta, é proposto o uso da API FinalizationGroup adicional.
Um fato interessante. No início do artigo, fornecemos uma pequena visão geral dos já incluídos no padrão WeakMap e WeakSet. Acontece que o nome mais formal para o relacionamento usado no WeakMap é Ephemeron.
https://v8.dev/features/weak-references