为什么jQuery的内存泄漏太严重了?

这是我上周发布的一个问题的后续: 简单的jQuery Ajax调用在Internet Explorer中泄漏内存

我喜欢jquery语法及其所有不错的function,但是我一直遇到一个通过ajax调用泄漏内存来自动更新表格单元的页面。

所以我创build了两个简单的testing页面进行实验。 两页都会每隔1秒做一次ajax调用。 每次Ajax调用成功后,计数器递增并更新DOM。 脚本在1000个周期后停止。

一个使用jQuery的Ajax调用和更新DOM。 另一个使用Yahoo API作为ajax,并执行document.getElementById(…)。innerHTML来更新DOM。

jquery版本严重泄漏内存。 运行在IE7的XP Home上,从9MB开始,到48MB左右,内存一直呈线性增长。 如果我注释掉更新DOM的行,它仍然在32MB,表明即使是简单的DOM更新泄漏大量的内存。 非jQuery版本的启动和结束大约9MB,无论是否更新DOM。

有没有人有一个很好的解释是什么导致jquery泄漏如此严重? 我错过了什么明显的? 有没有我不知道的循环引用? 或者jquery只是有一些严重的内存问题?

这是leaky(jquery)版本的来源:

<html> <head> <script type="text/javascript" src="http://www.google.com/jsapi"></script> <script type="text/javascript"> google.load('jquery', '1.4.2'); </script> <script type="text/javascript"> var counter = 0; leakTest(); function leakTest() { $.ajax({ url: '/html/delme.x', type: 'GET', success: incrementCounter }); } function incrementCounter(data) { if (counter<1000) { counter++; $('#counter').text(counter); setTimeout(leakTest,100); } else $('#counter').text('finished.'); } </script> </head> <body> <div>Why is memory usage going up?</div> <div id="counter"></div> </body> </html> 

这里是不泄漏的版本:

 <html> <head> <script type="text/javascript" src="http://yui.yahooapis.com/2.8.0r4/build/yahoo/yahoo-min.js"></script> <script type="text/javascript" src="http://yui.yahooapis.com/2.8.0r4/build/event/event-min.js"></script> <script type="text/javascript" src="http://yui.yahooapis.com/2.8.0r4/build/connection/connection_core-min.js"></script> <script type="text/javascript"> var counter = 0; leakTest(); function leakTest() { YAHOO.util.Connect.asyncRequest('GET', '/html/delme.x', {success:incrementCounter}); } function incrementCounter(o) { if (counter<1000) { counter++; document.getElementById('counter').innerHTML = counter; setTimeout(leakTest,100); } else document.getElementById('counter').innerHTML = 'finished.' } </script> </head> <body> <div>Memory usage is stable, right?</div> <div id="counter"></div> </body> </html> 

我最初的想法是,这与jQuery Ajax方法的方式有关:

一个。 创build循环引用,特别是对IE不好

湾 在内部对象上创build属性,这些内部对象由于创build方式和DontDelete属性的设置而无法删除。 看到这个更多的信息: http : //perfectionkills.com/understanding-delete/

无论哪种方式,垃圾收集器将被阻止拿起垃圾,这将导致内存泄漏失控,特别是如果嫌疑function频繁执行。