我想在 JavaScript 中缓存大对象。这些对象是通过键检索的,缓存它们是有意义的。但它们不会一次全部放入内存中,因此我希望在需要时对它们进行垃圾收集 - GC 显然更了解。
使用以下命令创建这样的缓存非常简单WeakReference
or WeakValueDictionary
在其他语言中也可以找到,但在 ES6 中我们有WeakMap
相反,在哪里keys很弱。
那么,是否有可能制作类似的东西WeakReference
或者从中进行垃圾收集缓存WeakMap
?
在两种情况下,弱哈希映射很有用(您的似乎适合第二种):
人们希望将信息附加到具有已知身份的对象上;如果该对象不复存在,则附加信息将变得毫无意义,并且同样应不复存在。 JavaScript 支持这种场景。
人们希望合并对语义相同的对象的引用,以减少存储需求并加快比较。例如,用对同一子树的引用替换对相同大子树的许多引用可以允许内存使用和执行时间减少一个数量级。不幸的是 JavaScript 不支持这种情况。
在这两种情况下,表中的引用只要有用,就会保持活动状态,并且当它们变得无用时,将“自然”变得有资格被收集。不幸的是,设计者并没有为上面定义的两种用法实现单独的类,WeakReference
这样做是为了让它可以有点用,尽管不是很好。
在键定义相等以表示参考身份的情况下,WeakHashMap
将满足第一个使用模式,但第二个将毫无意义(持有对语义上与存储的键相同的对象的引用的代码将持有对存储的键的引用,并且不需要 WeakHashMap 为其提供一个)。在键定义某种其他形式的相等性的情况下,表查询返回除存储对象的引用之外的任何内容通常没有意义,但避免存储的引用使键保持活动状态的唯一方法是用一个WeakHashMap<TKey,WeakReference<TKey>>
并让客户端检索弱引用,检索存储在其中的关键引用,并检查它是否仍然有效(它可以在WeakHashMap
返回WeakReference
和时间WeakReference
本身受到检查)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)