他在电报频道中写了一个小帖子。 我认为这可能对Habr的读者感兴趣。
最近,V8博客上的一篇文章专门介绍了新的WeakRef(第3阶段)prozal-“弱引用和终结器”。
我将以身作则,以自己的语言来解释其实质。 假设您在浏览器中进行了某种图像处理,例如,对它们应用了水印(我同意,该示例不是很现实),然后以某种方式使用了这些图像。 水印由大量消耗CPU的功能叠加。 图像可以重复,因此,为了不再次加载处理器,我们在Map
创建带有水印的图像缓存,让图像文件的名称为键。 但是,如果我们不使用某些图像,则会出现问题,因为它会Map
到该图像(强引用),因此图像仍将保留在内存中。 因此,为了使我们的Map
不会消耗过多的内存,有必要以某种方式确定这种情况并用手清理缓存。 这不是很方便。
这是WeakRef进行救援的地方。 使用WeakRef,您可以创建指向图像的弱链接,并通过键而不是图像本身来写:
const wr = new WeakRef(image); cache.set(name, wr); // const ref = cache.get(name); const image = ref.deref();
在这种情况下,垃圾收集器将能够独立确定何时不再需要缓存中的图像并清除内存。 为了从提案中的Map清除键,建议使用附加的FinalizationGroup API。
一个有趣的事实。 在本文的开头,我们简要介绍了标准中已包含的WeakMap和WeakSet。 事实证明,在WeakMap中使用的关系的最正式名称是Ephemeron。
https://v8.dev/features/weak-references