在Chrome文档的this page上,他们提供了以下代码示例:
function start()
{
var p = document.getElementById("p");
detached = document.createElement("div");
p.appendChild(detached);
p.removeChild(detached);
//Fill up detached with a bunch of garbage data
}
然后他们声称这是泄漏,因为
.. DOM节点与树分离,但它仍然保存引用脚本数据的DOM包装器对象,有效地阻止了数据的收集。
这对我没有意义。
detached
仍被脚本引用(因为它是一个闭包)?不应该detached = null
足以让GC收集detached
并删除泄漏吗?如果p
被移除,为什么detached
仍然会引用p.appendChild(detached);
p.removeChild(detached);
?如果(1)为真,则不应该
app:popupTheme="@style/MyCustomOverflowTheme"
什么都不做?
答案 0 :(得分:2)
是的,这是写得很糟糕的文档。如果fill()
方法曾经引用过全局对象(例如fill2()
),那么这句话就有意义了,所以我怀疑示例代码在某些时候发生了变化。
detached = null
将根据以下示例解决内存泄漏问题。
function start()
{
var p = document.getElementsByTagName("div")[0];
detached = document.createElement("div");
p.appendChild(detached);
p.removeChild(detached);
fill();
}
function fix()
{
detached = null;
}
function fill()
{
for (var i = 0; i < 25; ++i) {
var div = document.createElement('div');
div.data = new Array(10000);
for (var j = 0, l = div.data.length; j < l; ++j)
div.data[j] = j.toString();
detached.appendChild(div);
}
}
function fill2()
{
window.data = new Array(10000);
for (var j = 0, l = window.data.length; j < l; ++j)
window.data[j] = j.toString();
for (var i = 0; i < 25; ++i) {
var div = document.createElement('div');
div.data = window.data;
detached.appendChild(div);
}
}