需要弱地图(a,b) - > C

时间:2015-12-10 13:15:31

标签: javascript memory-leaks weakmap

我有一个memoized 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) === NewRefCursor(a, b)。当ab被垃圾收集时,游标也应该被垃圾收集。

refToHash是另一个使用ES6 WeakMap的memoized函数,因此看到的引用仍然允许使用GC。

NewRefCursor要记忆起来要复杂得多,因为它使用两个参数来确定缓存命中,因此与WeakMap不兼容,因此会阻止任何从GC'编辑。我对任何欺骗行为持开放态度,将私有字段附加到输入对象,概率数据结构。这种泄漏需要解决。到目前为止,我唯一的解决方案是添加一个参数来memoize限制缓存大小,并基于每个应用程序调整该参数。毛。

2 个答案:

答案 0 :(得分:3)

如果你创建一个两级弱映射(在弱映射上存储弱映射),每当第一级的obj被gced时,你就会失去整个第二级(当a被gced时,你会丢失{{1} })。如果有b,您仍然会有b的弱图,只有在存在另一对(a时才会出现)。不是最好的实现,但我认为它足够了:

a

这个概念可以扩展到n级解决方案。这会解决您的问题还是我错过了什么?

答案 1 :(得分:0)

请参阅https://github.com/Dans-labs/dariah/blob/master/client/src/js/lib/utils.js中的memoize 它通过构建作为对象的所有参数的WeakMap索引以通用方式解决问题。 WeakMap索引为对象分配唯一的整数,然后可以通过stringify将其与其他参数放在一起。