为什么IE在jQuery对象中包装HTML响应时会泄漏内存?
我想弄清楚为什么IE在jQuery对象中包装AJAX请求的HTML页面进行处理时泄漏内存。 用户可以访问页面并让它静置几分钟或几小时,因此页面每分钟使用jQuery的ajax
方法几次获取新数据,然后用新的预渲染数据替换页面的重要部分。
此时,我已将其缩小为单个调用 – 当调用$(data)
来包装HTML字符串时,内存会出现一点点,并且似乎不会被垃圾回收。 随着时间的推移,使用了数百MB,我不得不重新加载页面或重新启动IE。
这个小提琴能够重现这个问题。 它使用AJAX来请求页面,然后在紧密循环中调用$(data)
以夸大泄漏。 Chrome和Firefox似乎都像我期望的那样做出反应(内存被回收),但是IE表现得很糟糕。 惊喜。
使用Process Explorer,我只看了两次运行上面的小提琴后,看到内存消耗大幅增加。
我目前在标准模式下使用IE9。
为什么会这样? 有解决方法吗?
更新
这是一个不使用AJAX来演示问题的小提琴 。
我找到了解决上述问题的方法。
在对此进行故障排除时,我尝试了各种方法以防止泄漏发生。 我想出的解决方案是使用$.ajax
来检索数据,使用$()
来包装结果。 相反,我使用$('#destination').load('sourceUrl #selector')
(参见文档 )将数据推送到隐藏的div中,然后以这种方式操纵结果。
原来$.load
$.parseHTML
使用$.parseHTML
下的$.parseHTML
来操纵结果并将它们推到指定的位置(而$()
显然没有)。 请参阅此处获取源代码行。
-
$(htmlText)
泄漏 -
$(bodyText)
不泄漏 -
$.parseHtml(htmlText)
慢慢泄漏(?) -
$.parseHtml(bodyText)
不会泄漏
这是一个小提琴演示。
我不知道为什么它的行为方式如此,但缺点似乎是:尽可能避免解析完整的HTML文档。
我看到你看到了什么,当我改变代码以在每次调用成功时重新分配函数,神奇地它没有泄漏(至少在我的环境中。)
所以,我的解决方案是愚蠢的,但它似乎对我有用。 对你起作用吗?
$(function(){ $.ajaxSetup({ cache: false }); $('#go').click(performCall); }); function performCall() { $('#timestamp').text('Working...'); $.ajax({ url: 'http://fiddle.jshell.net/', success: function(){ var func = function(data, textStatus, jqXHR) { $('#timestamp').text('Done at ' + new Date()); for(var x = 0; x < 100; x++) { var $a = $(data); } }; func(); } }); }