为什么IE在jQuery对象中包装HTML响应时会泄漏内存?

时间:2013-03-14 18:03:12

标签: jquery ajax internet-explorer memory-leaks

我正在试图弄清楚为什么IE在jQuery对象中包装AJAX-ly请求的HTML页面进行处理时泄漏内存。用户可以访问该页面并让它静置几分钟或几小时,因此该页面每分钟使用jQuery的ajax方法几次获取新数据,然后我用新的pre替换页面的重要部分 - 数据。

此时,我已将其缩小为单个调用 - 当调用$(data)来包装HTML字符串时,内存会出现一点点,并且似乎不会被垃圾回收。随着时间的推移,使用了数百MB,我不得不重新加载页面或重新启动IE。

This fiddle能够重现此问题。它使用AJAX来请求页面,然后在紧密循环中调用$(data)以夸大泄漏。 Chrome和Firefox似乎都像我期望的那样做出反应(内存被回收),但IE表现得很糟糕。惊喜。

使用Process Explorer,我发现只有两次运行上述小提琴后,内存消耗量会大幅增加。

enter image description here

我目前在标准模式下使用IE9。

为什么会这样?有解决方法吗?

更新

这是一个fiddle,它在不使用AJAX的情况下演示了这个问题。

2 个答案:

答案 0 :(得分:3)

我找到了解决上述问题的方法。

在对此进行故障排除时,我尝试了各种方法以防止泄漏发生。我想出的解决方案是使用$.ajax来检索数据,并使用$()来包装结果。相反,我使用$('#destination').load('sourceUrl #selector')(请参阅documentation)将数据推送到隐藏的div中,然后以这种方式操纵结果。

原来$.load使用$.parseHTML来掩盖操作结果并将其推送到指定位置(而$()显然没有)。源代码行See here

  • $(htmlText)泄露
  • $(bodyText)不泄漏
  • $.parseHtml(htmlText)慢慢泄漏(?)
  • $.parseHtml(bodyText)不泄漏

这是一个fiddle来演示。

我不知道为什么它的行为方式,但缺点似乎是:尽可能避免解析完整的HTML文档。

答案 1 :(得分:0)

我看到你所看到的,当我每次调用成功时更改代码以重新分配函数时,神奇地它没有泄漏(至少在我的环境中。)

所以,我的解决方案很愚蠢,但似乎对我有用。它对你有用吗?

$(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/