【发布时间】:2012-06-23 10:18:03
【问题描述】:
以下 javascript 代码似乎泄漏了内存,但我不知道为什么。我已经在 chrome 19 和 firefox 12 中尝试过。代码如下:
<body>
<input id="add" type="button" value="add" onclick="add()" />
<input id="remove" type="button" value="remove" onclick="remove()" />
<div id="content">
</div>
</body>
<script>
var count = 0;
function add() {
var i = 0,
newdiv;
for (i = 0; i < 10000; i++) {
newdiv = document.createElement('div');
document.getElementById("content").appendChild(newdiv);
newdiv.setAttribute('id', "div" + count);
newdiv.innerHTML = "section " + count;
newdiv = null;
count = count + 1;
}
}
function remove() {
var i = 0;
for (i = 0; i < count; i++) {
document.getElementById("content").removeChild(document.getElementById("div" + i));
}
count = 0;
}
</script>
当您不断单击添加 按钮,然后单击删除 按钮时,Windows 任务管理器 中的内存会不断增加。我预计当垃圾收集开始时内存会减少,但这似乎永远不会发生。
所以,我的问题是:这段代码是否存在内存泄漏?如果是,我该如何重构代码以修复泄漏?
【问题讨论】:
-
它似乎在 Chromium 19/Ubuntu 11.04 中没有内存问题。
-
只有一两个假设:
newdiv = null;不等于delete newdiv;所以我可能认为删除比将一些设置为null更好,这实际上不是undefined...如果你使用本地存储的文档引用并在闭包中执行所有内容,而不是在全局窗口对象上创建东西甚至会加速这件事并减少内存使用恕我直言