【问题标题】:Do I have to clean custom properties (Expandos) on window.onunload event?我是否必须在 window.onunload 事件上清理自定义属性(Expandos)?
【发布时间】:2010-05-03 07:15:29
【问题描述】:

在一篇文章中,我看到最好清除 window.unload 事件上的所有 expandos 以防止内存泄漏。

我不明白为什么要这样做。

浏览器不是在你离开页面后清理所有 DOM 及其相关资源吗?

谢谢,

布拉克·奥兹多安

【问题讨论】:

    标签: javascript dom memory-leaks custom-properties


    【解决方案1】:

    嘿,好问题。问题在于 JavaScript 对象和 DOM 节点之间的循环引用。

    假设您有一个指向 DOM 节点的全局 JavaScript 对象,并且该节点有一个 expando 属性返回该对象。当页面卸载时,脚本引擎“清空”JavaScript 对象,使其不再指向 DOM 节点。但是,它不能从内存中释放对象,因为仍然存在对它的引用(来自 DOM)。然后脚本引擎终止。

    DOM 上的Expando 属性只不过是对其他对象的引用。清理 DOM 时,它会破坏这些引用,但假定对象仍在使用中。在本例中,DOM 等待脚本引擎清理属于它的对象,但脚本引擎已经终止。

    所以,问题在于 DOM 只处理属于它的内存,并假设脚本引擎也会这样做。

    我希望这会有所帮助。

    见:http://msdn.microsoft.com/en-us/library/bb250448%28VS.85%29.aspx

    【讨论】:

    • 感谢您的清晰解释。我还不清楚的是,当页面卸载时,为什么 DOM 仍然存在。我的意思是如果卸载后没有页面可谈,为什么浏览器仍然在内存中保留该页面的DOM?
    • DOM 作为对象的集合存在于浏览器进程的内存堆中。这不像 DOM 是浏览器可以丢弃的单个实体。 (例外情况是为每个选项卡生成一个单独进程的浏览器。在这种情况下,浏览器可以通过终止进程并让操作系统回收内存来清理所有内容。)无论如何,当页面卸载时,“DOM”就消失了, 但由于循环引用,它的一部分可能会保留。并不是浏览器想要将它们抛在脑后,它只是无法清理它们,因为它认为仍然存在对它们的引用。
    • 我认为这仅适用于 IE,因为它进行垃圾收集的方式(即引用计数而不是标记和清除),对吧?
    猜你喜欢
    • 2023-03-16
    • 1970-01-01
    • 2021-08-29
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多