我不明白这段代码是如何导致内存泄漏的。
var theThing = null;
var replaceThing = function () {
var originalThing = theThing;
var unused = function () {
if (originalThing)
console.log("hi");
};
theThing = {
longStr: new Array(1000000).join('*'),
someMethod: function () {
console.log(someMessage);
}
};
};
setInterval(replaceThing, 1000);
如果我在函数 replaceThing
的末尾将 originalThing
设置为 null,一切都会好起来的。但是我在这里没有看到引用循环,我不知道为什么不能释放这些闭包。
v8 GC 不使用标记清除吗?如果我将这些代码放入 IIFE,内存泄漏仍然存在。但是根上下文如何到达这些变量和函数呢? 我使用 chrome 来测试这些代码。现在我对 GC 如何在 Closure 上工作感到困惑。
最佳答案
在第一次调用 originalThing
后,theThing
成为对新对象的引用,第二次和后续调用 originalThing
分配对对象的引用,然后 theThing
再次成为对新对象的引用,但是 originalThing
将链接到前一个对象
关于javascript - 为什么这个js函数会导致内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42502082/