javascript - 在 chrome 开发工具中查找 JS 内存泄漏

标签 javascript jquery google-chrome-devtools

我正在使用 chrome 开发工具来确定某些 JS 代码中是否存在内存泄漏。 内存时间轴看起来不错,内存按预期回收。

enter image description here

但是,内存快照 令人困惑,因为它看起来像是泄漏,因为“分离的 DOM 树”下有条目。

“Detached DOM Tree”下的东西是在等待垃圾回收还是这些是真正的泄漏?

还有谁知道如何找出哪个函数持有对分离元素的引用?

enter image description here

最佳答案

这些元素在您的代码中被引用,但它们与页面的主 DOM 树断开连接。

简单的例子:

var a = document.createElement("div");

a 现在引用一个断开连接的元素,当 a 仍在范围内时,它不能被 GC。

如果分离的 dom 树持久存在于内存中,那么您将保留对它们的引用。使用 jQuery 可以很容易地做到这一点, 只需保存对遍历结果的引用并保留它。例如:

var parents = $("span").parent("div");
$("span").remove();

现在这些跨度被引用了,即使看起来您并没有引用它们。 parents 间接保留引用 通过 jQuery .prevObject 属性的所有范围。所以执行 parents.prevObject 会给出引用所有跨度的对象。

请参阅此处的示例 http://jsfiddle.net/C5xCR/6/ .即使没有直接显示 span 会被引用, 它们实际上由 parents 全局变量引用,您可以看到 Detached DOM 树中的 1000 个跨度永远不会消失。

现在这里是相同的 jsfiddle,但具有:

delete parents.prevObject

而且您可以看到 span 不再位于分离的 dom 树中,或任何地方。 http://jsfiddle.net/C5xCR/7/

关于javascript - 在 chrome 开发工具中查找 JS 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11930050/

相关文章:

javascript - 当调用使用回调的函数(在循环中)时,如何传递变量并使它们不改变?

electron - Electron :如何在BrowserWindow中打开chrome://inspect特殊URL来调试SharedWorkers

javascript - JQuery .append 和 .remove 似乎无法正常工作

javascript - 静态图像文件在node.js/express中不可见

javascript - Div 溢出,滚动只在那里工作,直到 div 被删除并触发该溢出 offsetheight div 的偏移量

javascript - 如何清空div的内容

javascript - 将标题添加到 window.location.pathname

javascript - jQueryUI : animate parent element height on child animation

javascript - jquery.find() 可以只选择直接 child 吗?

javascript - 为什么 Chrome 在 jQuery 中的某行暂停?