WeakRef-添加到ECMAScript标准的建议

他在电报频道中写了一个小帖子。 我认为这可能对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

Source: https://habr.com/ru/post/zh-CN460297/


All Articles