WeakRef - Vorschlag zur Ergänzung des ECMAScript-Standards

Er schrieb einen kleinen Beitrag in seinem Telegrammkanal. Ich dachte, dass es für die Leser von Habr von Interesse sein könnte.


Kürzlich erschien im V8-Blog ein Artikel über das neue WeakRef (Stage 3) -Prozal - "Schwache Referenzen und Finalisierer".


Ich werde versuchen, sein Wesen anhand meiner eigenen Worte anhand eines Beispiels zu erklären. Stellen Sie sich vor, Sie haben eine Art Bildverarbeitung in Ihrem Browser, zum Beispiel wird ein Wasserzeichen auf sie angewendet (ich stimme zu, das Beispiel ist nicht sehr realistisch), und dann werden diese Bilder irgendwie verwendet. Das Wasserzeichen wird von einer Funktion überlagert, die die CPU intensiv verbraucht. Bilder können wiederholt werden. Um den Prozessor nicht erneut zu laden, erstellen wir einen Cache mit Bildern mit einem Wasserzeichen in Map . Der Name der Bilddatei ist der Schlüssel. Hier tritt jedoch ein Problem auf, wenn ein Bild von uns nicht verwendet wird, es sich dennoch im Speicher befindet, da die Map den Schlüssel dazu enthält (starker Bezug). Damit unsere Map nicht zu viel Speicherplatz verbraucht, müssen Sie solche Situationen irgendwie ermitteln und den Cache mit Ihren Händen bereinigen. Dies ist nicht sehr praktisch.


Hier kommt WeakRef zur Rettung. Mit WeakRef können Sie ein schwaches Glied zu einem Bild erstellen und es anstelle des Bildes selbst per Schlüssel schreiben:


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

In diesem Fall kann der Garbage Collector unabhängig voneinander Situationen ermitteln, in denen das Bild im Cache nicht mehr benötigt wird, und den Speicher löschen. Um Schlüssel aus Map im Vorschlag zu löschen, wird vorgeschlagen, die zusätzliche FinalizationGroup-API zu verwenden.


Eine interessante Tatsache. Ganz am Anfang des Artikels geben wir einen kleinen Überblick über die WeakMap und WeakSet, die bereits im Standard enthalten sind. Es stellt sich heraus, dass der formalste Name für die in WeakMap verwendete Beziehung Ephemeron ist.


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

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


All Articles