【问题标题】:JavaScript Memory Leak - Garbage Collection on DOM Nodes and descendantsJavaScript 内存泄漏 - DOM 节点和后代上的垃圾收集
【发布时间】:2015-03-16 03:12:42
【问题描述】:

在现代浏览器中,DOM 节点会被垃圾收集器从内存中删除,前提是它们没有指向它们的引用(事件侦听器的特殊情况*)

我正在寻找有关 DOM 后代节点的一些清晰信息。我假设后代关系是单向的父->子。因此,如果父节点没有附加到 DOM 并且没有引用,它将被收集,并且您将获得子元素的多米诺骨牌效应。这是正确的吗?

或者是否有必要遍历节点并分离所有节点?

【问题讨论】:

  • 是的,没错
  • “我假设后代关系是单向的 parent->child。” 每个节点也有一个 .parent 属性。

标签: javascript dom garbage-collection


【解决方案1】:

我假设后代关系是单向的父->子。

不,这些关系是双向的。

但这对垃圾收集器(至少不是标记-清除类型)无关紧要,因为垃圾收集器只关心可达性,而不关心对象的连接性。 如果使用引用计数,您需要一个循环收集器来检测这种情况,但是仍然可以收集整个子树而无需先断开子树的连接。

或者是否有必要遍历节点并分离所有节点?

这没有必要,不。除非您打算保留对某个后代节点的引用,但仍希望收集断开连接树的其他部分。

请问这是否适用于带有引用节点的匿名函数的事件监听器

如果匿名函数在其作用域链中有 dom 节点本身(或另一个持有 dom 节点的对象),那么它取决于函数实例是否有其他东西。

更一般地说:任何对象都有资格进行垃圾回收除非它可以从 GC 根访问。

大致来说,浏览器中的主要 GC 根是全局/窗口对象。如果窗口对象消失了,其他一切都会消失。

来自 GC 根的路径可能非常长且复杂,因此在某些情况下必须仔细推理它们。 DOM 节点引用它们的回调函数,这些回调函数引用它们的作用域链,这些作用域链可以引用其他 dom 节点等等。

【讨论】:

  • "垃圾收集器只关心可达性" 所以不是缺少引用吗?是否缺少引用来返回 DOM 或脚本执行?这真的很有用!请问这是否适用于具有引用节点的匿名函数的 eventListener,或者我应该发布一个新问题吗?
猜你喜欢
  • 2012-06-28
  • 1970-01-01
  • 2018-05-10
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 2011-02-12
  • 2016-11-02
  • 2010-12-15
相关资源
最近更新 更多