我创建了一个网页,每秒进行一次Ajax调用。在Internet Explorer 7中,它泄漏内存不足(在大约15分钟内20 MB)。
程序很简单。它只是运行一个JavaScript函数,使Ajax调用。服务器返回一个空字符串,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.7.2'); </script> <script type="text/javascript"> setTimeout(testJunk,success: function(data){setTimeout(testJunk,1000)} }); } </script> </head> <body> Why is memory usage going up? </body> </html>
它似乎没有任何区别,但。我不对DOM做任何事情,如果我注释掉Ajax调用,内存泄漏停止。所以看起来泄漏是完全在Ajax调用。 jQuery Ajax本质上创建某种循环引用,如果是这样,我如何释放它?顺便说一句,它不会在Firefox中泄漏。
有人建议在另一个VM中运行测试,看看结果是否相同。而不是设置另一个虚拟机,我发现一台笔记本电脑运行XP Home与Internet Explorer 8.它表现出同样的问题。
我尝试一些旧版本的jQuery,并得到更好的结果,但问题没有完全消除,直到我放弃了Ajax在jQuery和更传统(和丑陋)Ajax。
解决方法
这里是一个
@L_403_1@的bug,在jQuery,以及作为一个建议的修复jQuery 1.4.2:
--- jquery-1.4.2.js 2010-04-08 12:10:20.000000000 -0700 +++ jquery-1.4.2.js.fixed 2010-04-08 12:10:38.000000000 -0700 @@ -5219,7 +5219,7 @@ // Stop memory leaks if ( s.async ) { - xhr = null; + xhr.onreadystatechange = null; xhr.abort = null; xhr = null; } } };
注意:这是官方修正在jQuery 1.4.4,所以你最好的打赌是只是立即升级。