【问题标题】:Javascript memory leaks when object property references the object itself (self reference)当对象属性引用对象本身(自引用)时,Javascript 内存泄漏
【发布时间】:2013-05-10 03:10:54
【问题描述】:

假设我有这样的代码

var obj = {};
obj.a = obj;

我知道现代浏览器实现了 Mark-and-sweep 算法,在这种情况下不应该有内存泄漏。但我不确定实现引用计数的旧浏览器是否将其视为循环引用。

在我看来,应该存在内存泄漏,因为引用计数为 1(由同一对象的“a”属性引用)。我是否正确引用计数为 1 或者如果对象被自身引用,浏览器不会增加引用计数?

【问题讨论】:

    标签: javascript memory-management memory-leaks


    【解决方案1】:

    较旧的浏览器(我假设您正在谈论诸如 IE6 之类的东西)对您列出的引用没有问题,因为它完全包含在 javascript 中并且它们处理得很好。

    旧浏览器存在循环引用问题的地方是 javascript 对象和 DOM 对象之间存在循环引用。如果您不将 DOM 对象存储在持久性 javascript 变量中,或者您不将对 javascript 对象的引用存储在 DOM 属性中,那么您将不会遇到此问题。在现代浏览器中也不再是问题。

    【讨论】:

    • 你的意思是如果我将第一行更新为 var obj=document.getElementById() 就会泄漏
    • @KhanhTo - 没有。您必须有一个指向 javascript 对象的 DOM 对象属性和具有指向该 DOM 对象的属性的相同 javascript 对象。 DOM 和 javascript 之间的循环引用。
    • 为什么DOM对象和javascript对象有区别?为什么算法要关心是javascript对象还是DOM对象?
    • @KhanhTo - 因为 javascript 和 DOM 各自拥有或拥有独立的垃圾收集器,因为它们是独立的系统,这就是导致问题的原因。
    • 很高兴知道这一点。您是否有任何官方文档的链接,以便我可以阅读有关单独垃圾收集器的更多信息。非常感谢。
    猜你喜欢
    • 2012-10-01
    • 2017-06-28
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    相关资源
    最近更新 更多