为什么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(); } }); } 

http://jsfiddle.net/tCvUw/