【问题标题】:Do any web browsers garbage collect removed dom elements? (as opposed to Javascript objects)是否有任何网络浏览器垃圾收集已删除的 dom 元素? (相对于 Javascript 对象)
【发布时间】:2011-12-29 15:19:52
【问题描述】:

如果一个 Web 应用程序从不刷新页面,而是完全从第一页加上 Javascript 请求构建而成,从而根据需要创建和销毁元素,那么任何浏览器都会重用过时的 dom 元素使用的内存吗?

这是否计划在任何浏览器中?

我认为成熟的 extJS 应用程序对这种内存泄漏非常敏感。

是否有任何真正有效的重用策略来缓解这个问题?

我这里不是指 Javascript 对象垃圾回收,只是移除了 DOM 元素,但我不确定这是否本质上是一样的。

【问题讨论】:

标签: javascript dom memory browser html-rendering


【解决方案1】:

看起来 Chrome 会这样做:http://jsfiddle.net/GaPLT/1/

内存使用情况:

  1. 开始:45K
  2. 添加后:60K
  3. 删除后:49K

【讨论】:

  • 非常有说明性的工具,我们能解释一下 4K 是从哪里来的吗?
  • @barrymac:我不能确切地告诉你,但我猜悬停按钮(即新图形)和处理点击也会占用一些内存。当您甚至移动鼠标时,幕后的事情也可能会使用内存,例如 jsFiddle 上文本区域的褪色标签。
  • 我知道这有点迂腐,但我相信有人知道,或者也许有一个更简单和可控的测试来消除这些歧义。
【解决方案2】:

简短的回答是这取决于您的 JavaScript 引擎。

Chrome 的 V8 就是这样http://code.google.com/apis/v8/design.html#garb_coll

【讨论】:

  • 我原以为 DOM 垃圾收集与 Javascript 对象垃圾收集不一样,而且我知道 V8 围绕 Javascript 的原型设计有一些有趣的方式。他们的优化是否也适用于实际的 DOM 元素?
  • 这篇文章只讲JS内存。它甚至没有提到 DOM。 Chrome 将 DOM 元素存储为原生对象并为每个元素创建 JS 包装器对象,并且 JS 包装器对象与其他 JS 对象一样是 GC,除了它们按 DOM 子树分组保存。我搜索并找不到他们如何对实际的底层原生 DOM 对象进行内存跟踪。 Firefox 和 IE 都使用引用计数(或者至少在 2010 年左右使用了,我不确定从那以后它是否改变了)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多