wiz*_*rd0 11 javascript caching garbage-collection ecmascript-harmony ecmascript-6
我想在JS中缓存大对象.这些对象是按键检索的,缓存它们是有意义的.但它们不会同时适合内存,所以我希望它们在需要时进行垃圾收集 - GC显然知道更好.
使用其他语言中的WeakReference或WeakValueDictionary来创建这样的缓存是非常简单的,但是在ES6中我们有WeakMap,而密钥很弱.
那么,是否有可能制作类似于WeakReference或制作垃圾收集的缓存WeakMap?
有两种情况可能会使哈希映射变弱(您的哈希值似乎适合第二种情况):
人们希望将信息附加到具有已知身份的对象上; 如果对象不再存在,附加的信息将变得毫无意义,同样也应该不再存在.JavaScript支持此方案.
为了减少存储要求和加快比较,人们希望将引用合并到语义相同的对象.将大量引用替换为相同的大子树,例如,通过引用相同的子树,可以允许减少内存使用和执行时间的数量级.不幸的是JavaScript不支持这种情况.
在这两种情况下,表中的引用只要它们有用就会保持活着,并且当它们变得无用时"自然地"变得有资格收集.不幸的是,不是为上面定义的两个用法实现单独的类,设计者WeakReference使它可以有点可用,但不是很好.
在密钥定义相等于引用标识的情况下,WeakHashMap将满足第一种使用模式,但第二种使用模式将毫无意义(持有对与存储密钥在语义上相同的对象的引用的代码将保存对存储密钥的引用,并且不需要WeakHashMap给它一个).在密钥定义其他形式的相等的情况下,对于表查询返回除了对存储对象的引用之外的任何内容通常没有意义,但是避免使存储的引用使密钥保持活动的唯一方法是使用a WeakHashMap<TKey,WeakReference<TKey>>并让客户端检索弱引用,检索存储在其中的密钥引用,并检查它是否仍然有效(它可以在WeakHashMap返回WeakReference的时间和WeakReference检查自身的时间之间收集).