WeakRef - propuesta para agregar al estándar ECMAScript

Escribió una pequeña publicación en su canal de telegramas. Pensé que podría ser de interés para los lectores de Habr.


Recientemente, apareció en el blog V8 un artículo sobre el nuevo prozal WeakRef (Etapa 3) - "Referencias y finalizadores débiles".


Trataré de explicar con mis propias palabras su esencia con el ejemplo. Imagine que tiene algún tipo de procesamiento de imágenes en su navegador, por ejemplo, se les aplica una marca de agua (estoy de acuerdo, el ejemplo no es muy realista), y luego estas imágenes se usan de alguna manera. La marca de agua está superpuesta por una función que consume intensamente la CPU. Las imágenes se pueden repetir, por lo tanto, para no cargar el procesador una vez más, creamos un caché de imágenes con una marca de agua en el Map , dejando que el nombre del archivo de imagen sea la clave. Pero aquí surge un problema si alguna imagen no será utilizada por nosotros, todavía estará en la memoria, ya que el Map será la clave (referencia fuerte). Por lo tanto, para que nuestro Map no consuma el exceso de memoria, es necesario determinar de alguna manera tales situaciones y limpiar el caché con las manos. Esto no es muy conveniente.


Aquí es donde WeakRef viene al rescate. Usando WeakRef, puede crear un enlace débil a una imagen y escribirla por clave en lugar de la imagen en sí:


 const wr = new WeakRef(image); cache.set(name, wr); //    const ref = cache.get(name); const image = ref.deref(); 

En este caso, el recolector de basura podrá determinar de forma independiente las situaciones en que la imagen en el caché ya no es necesaria y borrar la memoria. Para borrar claves de Map en la propuesta, se propone utilizar la API FinalizationGroup adicional.


Un hecho interesante Al comienzo del artículo, ofrecemos una pequeña descripción general de WeakMap y WeakSet ya incluidos en el estándar. Resulta que el nombre más formal para la relación utilizada en WeakMap es Ephemeron.


https://v8.dev/features/weak-references

Source: https://habr.com/ru/post/460297/


All Articles