Fre*_*ind 3 javascript memory-leaks
我有一个简单的html/javascript代码,它将创建一些DOM然后删除它们.
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="utf-8">
<title>Custom Plunker</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
</head>
<body>
<button onclick="create()"> Create </button>
<button onclick="clearContainer()"> Clear </button>
<div id="container"></div>
</body>
</html>
<script>
function create() {
var c = $("#container");
for(var i = 0;i<10000; i++){
c.append("<li>Hellosd fssd f df sdf f f wef ewf we fwe f wef ewf wef ew few f ewf wf ewf wef </li>");
}
}
function clearContainer() {
var c = $("#container");
c.empty();
}
</script>
Run Code Online (Sandbox Code Playgroud)
将有一个Create按钮和一个Clear按钮.当我单击"创建"按钮时,它会将10000个li元素附加到容器div,当我单击"清除"按钮时,它将删除它们.
当我在chrome上尝试它时,chrome进程的初始内存使用量大约为30M,在我点击创建按钮几次后它增长到70M,当我点击clear按钮时,它变为50M.它比初始时多20M.
然后我在IE8上尝试它,IE进程的初始内存使用量约为30M,在我单击"创建"按钮一次后,它增长到100M以上,当我点击"清除"按钮时,它变为80M.它比初始时多50M.
代码是否有内存泄漏?怎么解决?
代码是否有内存泄漏?
不是.浏览器只是保留他们分配的一些内存,以防他们需要重用它,和/或还没有(还)垃圾收集不再引用的对象.因为你已经发布了对列表项元素的所有引用(通过jQuery的empty调用),所以它是由浏览器实际让它们去的.
当然,这个答案假设你正在调用的jQuery函数中没有错误导致内存泄漏(特别是创建li元素的那个).这可能是一个合理的假设,虽然当然每隔一段时间,即使是一个备受尊重的图书馆也会有错误.如果jQuery的一个常见功能(包括元素构造)在给定版本中具有显着的内存泄漏,则可能会在合理的时间内找到,报告和修复,因为使用该库的人数和所涉及的团队它.
我们还假设浏览器处理导致内存泄漏的DOM操作没有错误,这是一个不太确定的假设.(从历史上看,浏览器[无论风味]都有内存泄漏的各种问题;我认为任何浏览器都不会免疫.)
但是如果你明白我的意思,你的代码就没有泄漏.