【发布时间】:2012-01-14 12:47:44
【问题描述】:
我是 javascript 新手,似乎在跟踪内存泄漏时遇到了一些问题。我已将其缩小到似乎会导致内存泄漏的部分,因为代码相当复杂。我将发布一个不同的示例,将其简单化但会导致相同的问题(只是小得多)。
基本上,我有一些代码可以动态构建 HTML 并将事件附加到 HTML。每次 AJAX 请求都会重建 HTML。这一切都在第一次工作得很好,但是在每次 AJAX 请求之后,浏览器内存都会增加(并不总是相等)!通过在 jsfiddle 上多次单击运行并查看浏览器内存可以重现此问题。我的假设是创建的闭包永远不会被垃圾收集,但我不确定?如果是这种情况,有没有更好的方法来做到这一点而不会导致任何问题的闭包?
这发生在 FF8、最新版本的 Chrome 和 IE 8 中。很可能所有其他版本 - 正是我测试过的。
我在代码中添加了一些 cmets,应该会有所帮助。
谢谢!
编辑: 好的,所以在使用 sIEve 进行更多研究之后,我可以看到每次 AJAX 调用时 DOM 节点的数量增加了一倍。我已经更新了示例来模拟这一点。所以我的问题是为什么在调用 jQuery 为空或删除函数后 DOM 元素没有被垃圾收集?我还遍历了取消绑定事件处理程序的东西中的元素,并将每个 DOM 元素 js 引用设置为 null 而没有影响...
【问题讨论】:
-
IE6 存在一些 HTML/DOM-JS 内存问题等(问题是 DOM 有一个内存模型,而 JS 引擎有另一个并试图在两者之间解决),尽管我认为这在很大程度上已经解决了......不确定现代浏览器中是否存在任何当前的“陷阱”。
-
我无法在最新的 Chrome 上重现这个:/
-
可能想说 Chrome 的“最新版本”是什么,因为它并不总是相同的。此外,指定使用的 jQuery 版本。 :) Old versions of jQuery had a memory leak with events.
-
@pst 抱歉,我使用的是 jQuery 1.7.1。我认为这是隐含的,因为它包含在 jsfiddle 示例中。我不确定 Chrome 版本是否相关。我的意思是问题似乎不是特定于浏览器的。
标签: javascript jquery browser memory-leaks