Il a écrit un petit message dans sa chaîne de télégramme. J'ai pensé que cela pourrait intéresser les lecteurs de Habr.
Récemment, un article sur le blog V8 dédié au nouveau profil WeakRef (Stage 3) - "Références et finaliseurs faibles".
Je vais essayer d'expliquer dans mes propres mots son essence par l'exemple. Imaginez que vous ayez une sorte de traitement d'image dans votre navigateur, par exemple, un filigrane leur est appliqué (je suis d'accord, l'exemple n'est pas très réaliste), puis ces images sont utilisées d'une manière ou d'une autre. Le filigrane est superposé par une fonction qui consomme intensivement le CPU. Les images peuvent être répétées, par conséquent, afin de ne pas charger à nouveau le processeur, nous créons un cache d'images avec un filigrane dans Map
, laissons le nom du fichier d'image être la clé. Mais ici, un problème se pose si une image ne sera pas utilisée par nous, elle sera toujours en mémoire, car la Map
sera la clé (référence forte). Par conséquent, afin que notre Map
ne consomme pas de mémoire excessive, il est nécessaire de déterminer en quelque sorte de telles situations et de nettoyer le cache avec vos mains. Ce n'est pas très pratique.
C'est là que WeakRef vient à la rescousse. En utilisant WeakRef, vous pouvez créer un lien faible vers une image et l'écrire par clé au lieu de l'image elle-même:
const wr = new WeakRef(image); cache.set(name, wr); // const ref = cache.get(name); const image = ref.deref();
Dans ce cas, le garbage collector pourra déterminer indépendamment les situations où l'image dans le cache n'est plus nécessaire et vider la mémoire. Pour effacer les clés de Map dans la proposition, il est proposé d'utiliser l'API FinalizationGroup supplémentaire.
Un fait intéressant. Au tout début de l'article, nous donnons un petit aperçu de ce qui est déjà inclus dans le standard WeakMap et WeakSet. Il s'avère que le nom le plus formel de la relation utilisée dans WeakMap est Ephemeron.
https://v8.dev/features/weak-references