95 可读性
 将光标移到文章中的句子上,可以查看原文。 显示译文      显示原文      双语对照

分享 |
为什么jquery泄漏内存?

60 0

这是我上周发布的一个问题: http://stackoverflow.com/questions/2429056/simple-jquery-ajax-call-leaks-memory-in-ie

我喜欢jquery语法和它的所有优秀特性,但是我一直遇到一个页面,通过ajax来自动更新表单元,而这一页泄漏内存。

所以我为实验创建了两个简单的测试页面。 两个页面每. 1秒执行一次ajax调用。 在每次成功的ajax调用之后,计数器递增并更新 DOM 。 脚本在 1000循环后停止。

一个使用jquery进行ajax调用,并更新 DOM 。 另一种使用Yahoo为 ajax,并使用 document.getElementById(...). innerHTML来更新 DOM 。

jquery版本严重地泄漏内存。 在滴水( 。在XP主页上使用 ie7 ) 中运行,从 9开始,在大约 48处完成,内存随时间线性增长。 如果我注释出更新DOM的行,它仍然在at完成,这表明即使简单的DOM更新也会泄漏大量内存。 非jquery版本在大约 9处启动和结束,无论它是否更新了 DOM 。

有谁对导致jquery泄漏如此严重的原因有很好的解释? 我是不是漏掉了什么? 是否有循环引用我不知道? 或者,jquery有一些严重的内存问题?

这是泄漏( 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> 


时间: 15年08月05日 原作者: Thomas Lane

7 0

我最初的想法是它与 jquery ajax方法的方式有关:

创建循环引用,尤其是对 IE

b 。在内部对象上创建属性,这些属性由于创建的方式和DontDelete属性的设置而无法删除。 有关更多信息,请参见这里选项: http://perfectionkills.com/understanding-delete/

不管是哪种方式,垃圾收集器都会被防止回收垃圾,这会导致内存泄漏失控,尤其是当可疑函数频繁执行时。

发布时间: 15年08月05日 原作者: Jessica Jacobs
...