【发布时间】:2011-01-26 14:36:33
【问题描述】:
我创建了一个每秒进行一次 Ajax 调用的网页。在 Internet Explorer 7 中,它会严重泄漏内存(大约 15 分钟 20 MB)。
程序非常简单。它只是运行一个进行 Ajax 调用的 JavaScript 函数。服务器返回一个空字符串,JavaScript 代码对此不做任何事情。我使用setTimeout 每秒运行一次函数,我使用Drip 来观看。
这里是来源:
<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>
如何堵住这个漏洞?我有一个真正的应用程序可以通过这种方式更新一个大表,但如果无人看管它会占用千兆字节的内存。
编辑:好的,所以在一些好的建议之后,我将代码修改为:
<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 中泄漏。
有人建议在另一个 VM 中运行测试,看看结果是否相同。我没有设置另一个 VM,而是找到了一台运行 XP Home 和 Internet Explorer 8 的笔记本电脑。它也出现了同样的问题。
我尝试了一些旧版本的 jQuery 并获得了更好的结果,但直到我在 jQuery 中放弃 Ajax 并使用更传统(且丑陋)的 Ajax 后,问题才完全消失。
【问题讨论】:
-
对答案也很好奇——我有想法但想知道结果。
-
好问题,我不知道答案,但您可能会考虑在成功函数中设置 setTimeout,这样如果您开始发出需要时间的请求,就不会导致服务器超载。如果您在发送下一个请求之前没有从服务器获得全部响应,您将打开一个新连接。
-
感谢关于移动 setTimeout 的建议。我试过了,但没有用。
-
您是否对可能导致问题的结果进行了任何处理?
-
我没有对结果做任何事情。除了url,我正在运行上面列出的程序。
标签: jquery ajax memory-leaks