【发布时间】:2014-01-21 03:56:03
【问题描述】:
我编写了一个相当大的网络应用程序。它工作了一段时间,然后慢慢开始缓慢运行,因为 DOM 节点开始蠕动在 80,000 - 100,000 左右。
所以我一直在 Chrome 开发工具控制台 (DCTC) 中处理一些小数据集。
有人可以告诉我为什么以下内容有时有效,有时却无效。
var test = $('<div></div>');
test.remove();
test = null; //Doesn't seem to make a difference when it doesn't work
如果我在 CDT 的时间轴下查看 DOM 节点数,有时节点数会正确,有时它似乎拒绝放弃我试图删除的 DOM 节点。即使在按下 GC 按钮后也是如此。
以下在移除 DOM 节点和释放内存方面似乎是一致的。
//Seems to remove nodes just fine
for(var i = 0; i<100; i++){
var test = $('<div></div>');
$("body").append(test);
}
$("body").empty();
关于第一个示例,我认为它有时可能因为 NODELETE 标志而不起作用,因为它是一个变量定义,所以我尝试将我的赋值放在一个对象上,但这没有帮助。实际上,jQuery 的 remove 不会删除 dom 节点似乎更一致。
//Does not remove the node.
var test = {};
test.node = $('<div></div>');
test.node.remove();
test.node = null;
为什么不一致?
观察:
如果我这样做test = document.createElement('div');,它将始终创建一个分离的节点。 var test = .... 似乎始终如一地允许我清除节点,直到它搞砸然后所有赌注都关闭。
针对大家说没有 DOM 节点,请阅读以下内容:https://developers.google.com/chrome-developer-tools/docs/heap-profiling-dom-leaks 我要删除的 DOM 节点显示在分离的 dom 节点中,但“我该如何摆脱它们”是迫在眉睫的问题仍然存在。
【问题讨论】:
-
$('<div></div>')创建一个新元素,在下一行删除它没有意义,因为它不在 DOM 中? -
您正在创建一个 div 并没有将它应用到任何地方,所以它不在 DOM 中。删除不会做任何事情
-
@adeneo 这很好,但是将变量设置为 null 也不会删除 DOM 节点。所以对它的任何引用都会丢失,GC 不会收集它。这是没有意义的。
-
在你真正将它添加到 DOM 之前,没有什么可以删除的,它只是一个保存元素的变量,当将变量设置为 null 时,你希望删除哪个 DOM 节点?跨度>
-
那么您是在告诉我 Chrome 开发工具的 DOM 计数报告不正确吗?如果您使用
$('<div></div>');或使用document.createElement('<div>');创建一个元素,DOM 计数会上升,但永远不会下降。不管它是否被插入到页面中,Chrome 开发工具似乎都认为它们在某处徘徊。这是不正确的吗?我只希望我的 DOM 节点数减少 :)
标签: javascript google-chrome memory google-chrome-devtools