gpt4 book ai didi

javascript - 弱映射内存泄漏

转载 作者:行者123 更新时间:2023-11-28 03:17:56 25 4
gpt4 key购买 nike

我正在更新我的一个开源项目,一个使用 RxJS 的对象更改通知程序。为了实现这一目标,我使用 Wea​​kmap 来跟踪对象位置和“属性链”(例如“a.b.c”,...)。我将 ES6 代理设置为 Weakmap 键,所有这些都具有相同的处理程序。

我创建了一个包装类,它在其构造函数中迭代源对象并返回一个“代理链”(即,如果属性是一个对象,它就成为一个代理,依此类推)。为了迭代对象,它使用下面的函数。

我遇到的问题似乎是内存泄漏(我想),我无法理解它来自哪里。 在不使用该类的情况下也会出现问题,所以我认为这可能与此函数有关。

function createProxyChain(sourceObject, handlers, all, parents) {
const descriptors = Object.getOwnPropertyDescriptors(sourceObject);
const targetObjectKeys = Object.keys(descriptors);
for (let i = targetObjectKeys.length, prop; prop = targetObjectKeys[--i];) {
if (sourceObject[prop] && typeof sourceObject[prop] === "object") {
const parentChains = parents && parents.map(c => `${c}.${prop}`) || [prop];
const proxyChain = createProxyChain(sourceObject[prop], handlers, all, parentChains);
descriptors[prop].value = proxyChain;
all.set(proxyChain, null);
}
}
const chain = Object.create(Object.getPrototypeOf(sourceObject) || {}, descriptors);
const proxiedChain = new Proxy(chain, handlers);

return proxiedChain;
}

并执行它:

var wk = new WeakMap();
var myObject = {
a: 1,
b: {
c: 2,
d: {
e: 3,
f: {
g: 4,
h: {
i: 5,
j: {
k: 6,
l: {
m: 7,
n: [[1, 2, 3], [4, 5, 6], [7, 8, 9]],
}
}
}
}
}
}
}

createProxyChain(myObject, {}, wk);

函数结束后,我将得到带有大约 10 个键的 WeakMap。如果我通过标志和 (window|global).gc([true]) 强制垃圾收集器在 Chrome/Node 中运行,我希望它们被删除,不是吗?

相反,Weakmap 保持填充状态,我可以通过在控制台中记录 Weakmap 来查看它。在我创建的一个包含大量设置操作的大型测试中,它可能会达到 100 多个键。这种行为是否正确,或者实际上存在内存泄漏?

即使我在对象中保存非代理元素而不是代理元素,似乎也会发生这种情况。如果我执行 myObject = null (删除任何可能的引用),也会发生这种情况。

非常感谢。

最佳答案

看起来这个问题并不是真正的问题。事实上,我正在使用控制台来测试这一点。我发现,也在 StackOverflow 上阅读某处,使用控制台不允许某些对象被垃圾收集。 V8 和 SpiderMonkey 上都会发生这种情况。

一起执行上面的代码块,还可以这样:

myObject = null;
(window || global).gc(true); // Valid only for V8

创建 Weakmap 并成功清空它。

所以我所做的就是逐行执行,关闭控制台并重新打开它。我打印了 WeakMap 内容,但它不再可用。 (这在 Chrome 和 Firefox 上都是如此)可能需要打开和关闭不同的时间才能看到垃圾收集完成。

为了在 Firefox 上强制进行垃圾回收,我在 about:memory 上打开了一个新选项卡,并尝试单击按钮 GC

关于javascript - 弱映射内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59473921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com