Javascript 需要弱映射(a、b)——>;C
我有一个记忆fn,其中fn由两个输入参考进行记忆:Javascript 需要弱映射(a、b)——>;C,javascript,memory-leaks,weakmap,Javascript,Memory Leaks,Weakmap,我有一个记忆fn,其中fn由两个输入参考进行记忆: let NewRefCursor = memoized( (deref, swap) => refToHash(deref) + refToHash(swap), // memoizer identity fn (deref, swap) => new RefCursor(deref, swap)); // the function we are memoizing 我需要的行为是NewRefCursor(a,b)
let NewRefCursor = memoized(
(deref, swap) => refToHash(deref) + refToHash(swap), // memoizer identity fn
(deref, swap) => new RefCursor(deref, swap)); // the function we are memoizing
我需要的行为是NewRefCursor(a,b)==NewRefCursor(a,b)
。当a
或b
被垃圾收集时,光标也应该被垃圾收集
是另一个memorized函数,使用它可以使看到的引用仍然允许被GC调用
NewRefCursor
更难记忆,因为它使用两个参数来确定缓存命中率,因此与WeakMap
不兼容,因此将防止看到的任何引用被GC'ed。我愿意接受任何方式的欺骗,将私有字段附加到输入对象、概率数据结构。这个漏洞需要解决。到目前为止,我唯一的解决方案是在memoize中添加一个限制缓存大小的参数,并根据每个应用调整该参数。总。如果创建两级弱映射(将弱映射存储在弱映射上),则无论何时对第一级上的obj进行gced,都会丢失整个第二级(当a
进行gced时,就会丢失b
)。如果b
是gced,那么a
仍然会有一个弱映射,只有在有另一对(a
,某物)时才会出现。这不是最好的实施,但我认为它足够:
function BiWeakMap() {
this._map = new WeakMap();
}
BiWeakMap.prototype.set = function(key1, key2, value) {
if (!this._map.has(key1)) {
this._map.set(key1, new WeakMap());
}
this._map.get(key1).set(key2, value);
return this;
};
BiWeakMap.prototype.has = function(key1, key2) {
return this._map.has(key1) && this._map.get(key1).has(key2);
};
BiWeakMap.prototype.get = function(key1, key2) {
return this._map.get(key1) && this._map.get(key1).get(key2);
};
这个概念可以扩展到n级解决方案。这解决了您的问题还是我遗漏了什么?请参阅中的备忘录
它以一种通用的方式解决了这个问题,方法是为对象的所有参数建立一个WeakMap索引。WeakMap索引为对象分配唯一的整数,然后可以通过stringify将其与其他参数组合在一起。如果创建两级弱映射(将weakmaps存储在weakmaps上),则无论何时对第一级上的obj进行gced,都会丢失整个第二级(当对a进行gced时,会丢失b)。如果b是gced,那么a仍然会有一个弱映射,只有在有另一对(a,某物)时才会出现。这解决了你的问题还是我遗漏了什么?