我不明白这段代码是如何导致内存泄漏的。
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);
如果我在函数originalThing
的末尾将replaceThing
设置为null,那么一切都会好的。但我在这里没有看到参考循环,我也不知道为什么这些闭合无法释放。
并且没有v8 GC使用标记扫描?如果我将这些代码放入IIFE,内存泄漏仍然存在。但根本上下文如何实现这些变量和功能呢? 我使用chrome来测试这些代码。现在我对GC如何在Closure上工作感到困惑。
答案 0 :(得分:0)
请参阅https://www.ibm.com/developerworks/web/library/wa-memleak/
因为内部函数保存了对外部函数变量的引用,所以范围对象...不会被垃圾回收。
答案 1 :(得分:0)
在第一次调用originalThing
被指定为null之后,theThing
成为对新对象的引用,第二次和后续调用originalThing
指定对象的引用,然后再次theThing
成为对新对象的引用,但originalThing
将链接到上一个对象