双向 WeakMap 会导致内存泄漏吗?
Can a bi-directional WeakMap lead to a memory leak?
根据我对原生 JavaScript WeakMap 的了解,它们弱存储键,但强存储值,对吗?
如果是这样,在 WeakMap 中同时使用值作为键和值是否会阻止对象被垃圾回收?
const domElement0 = ...;
const domElement1 = ...;
const map = new WeakMap([
[ domElement0, domElement1 ],
[ domElement1, domElement0 ]
]);
假设 WeakMap 始终可用,在该片段中,我会假设,如果 domElement0
无法访问,则 domElement1
不会被垃圾收集,反之亦然,但如果它们都变得无法访问并与 DOM 分离,我能知道它们在大多数浏览器中都将符合 GC 条件吗?
如果是这样,有人可以提供参考说明为什么这是可能的吗?
我觉得他们应该变成垃圾。
WeakMap Objects的规范有如下注释:
WeakMap and WeakSets are intended to provide mechanisms for dynamically associating state with an object in a manner that does not “leak” memory resources if, in the absence of the WeakMap or WeakSet, the object otherwise became inaccessible and subject to resource reclamation by the implementation's garbage collection mechanisms.
因此,如果对对象的唯一引用是通过 WeakMap 条目,并且无法通过从 WeakMap 外部开始的某些引用链访问键,则对象将成为垃圾。
根据我对原生 JavaScript WeakMap 的了解,它们弱存储键,但强存储值,对吗?
如果是这样,在 WeakMap 中同时使用值作为键和值是否会阻止对象被垃圾回收?
const domElement0 = ...;
const domElement1 = ...;
const map = new WeakMap([
[ domElement0, domElement1 ],
[ domElement1, domElement0 ]
]);
假设 WeakMap 始终可用,在该片段中,我会假设,如果 domElement0
无法访问,则 domElement1
不会被垃圾收集,反之亦然,但如果它们都变得无法访问并与 DOM 分离,我能知道它们在大多数浏览器中都将符合 GC 条件吗?
如果是这样,有人可以提供参考说明为什么这是可能的吗?
我觉得他们应该变成垃圾。
WeakMap Objects的规范有如下注释:
WeakMap and WeakSets are intended to provide mechanisms for dynamically associating state with an object in a manner that does not “leak” memory resources if, in the absence of the WeakMap or WeakSet, the object otherwise became inaccessible and subject to resource reclamation by the implementation's garbage collection mechanisms.
因此,如果对对象的唯一引用是通过 WeakMap 条目,并且无法通过从 WeakMap 外部开始的某些引用链访问键,则对象将成为垃圾。