javascript - 为什么这个js函数会导致内存泄漏?

标签 javascript memory-leaks garbage-collection

我不明白这段代码是如何导致内存泄漏的。

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/

相关文章:

java - 如何防止垃圾收集器减慢我的应用程序

Java GC 安全点

javascript - OO JavaScript。属性(property)问题

javascript - 从服务更新 Angular Controller

javascript - 设置 Apple TV 视频 JavaScript

css - CSS3 动画会造成内存泄漏吗?

javascript - 如何使用 jQuery 事件监听器获取目标元素?

ios - 苹果是否批准存在内存泄漏的 iOS 应用程序?

android.widget.PopupWindow$PopupDecorView 在打开菜单的情况下旋转设备时泄漏

java - 为什么大多数 JVM gc 不使用引用计数?