我创建了一个每秒进行一次 Ajax 调用的网页。在 Internet Explorer 7 中,内存泄漏严重(大约 15 分钟内泄漏 20 MB)。
该程序非常简单。它只是运行一个进行 Ajax 调用的 JavaScript 函数。服务器返回一个空字符串,JavaScript 代码不对其执行任何操作。我用setTimeout
每秒运行该函数,我正在使用Drip http://sourceforge.net/projects/ieleak/观看该事物。
这是来源:
<html>
<head>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load('jquery', '1.4.2');
google.load('jqueryui', '1.7.2');
</script>
<script type="text/javascript">
setTimeout('testJunk()',1000);
function testJunk() {
$.ajax({ url: 'http://xxxxxxxxxxxxxx/test', // The url returns an empty string
dataType: 'html',
success: function(data){}
});
setTimeout('testJunk()',1000)
}
</script>
</head>
<body>
Why is memory usage going up?
</body>
</html>
如何堵住这个漏洞?我有一个真实的应用程序,可以通过这种方式更新一个大表,但如果无人看管,它将耗尽千兆字节的内存。
Edit:好吧,在一些好的建议之后,我将代码修改为:
<html>
<head>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load('jquery', '1.4.2');
google.load('jqueryui', '1.7.2');
</script>
<script type="text/javascript">
setTimeout(testJunk,1000);
function testJunk() {
$.ajax({ url: 'http://xxxxxxxxxxxxxx/test', // The url returns an empty string
dataType: 'html',
success: function(data){setTimeout(testJunk,1000)}
});
}
</script>
</head>
<body>
Why is memory usage going up?
</body>
</html>
不过,这似乎没有什么区别。我没有对 DOM 做任何事情,如果我注释掉 Ajax 调用,内存泄漏就会停止。所以看起来泄漏完全是在 Ajax 调用中。 jQuery Ajax 本质上是否会创建某种循环引用?如果是,我该如何释放它?顺便说一句,它在 Firefox 中不会泄漏。
有人建议在另一个虚拟机中运行测试,看看结果是否相同。我没有设置另一个虚拟机,而是找到了一台运行 XP Home 和 Internet Explorer 8 的笔记本电脑。它也出现了同样的问题。
我尝试了一些旧版本的 jQuery 并获得了更好的结果,但问题并没有完全消失,直到我放弃了 jQuery 中的 Ajax 并采用更传统(且丑陋)的 Ajax。