为什么IE包裹在一个jQuery对象的HTML响应时泄漏内存?(Why does IE leak m

2019-07-21 15:37发布

我想弄清楚为什么IE包裹的AJAX-LY请求HTML页面的jQuery对象进行处理时,泄漏内存。 用户可以访问该页面,并让它坐了好几分钟或几小时,所以该页面使用jQuery的ajax方法几次一分钟,以获得新的数据,然后我用新的预渲染数据替换页的重要组成部分。

在这一点上,我已经将范围缩小到一个单一的电话-当$(data)被调用来包装HTML字符串,内存尖刺了一下,似乎没有以往任何时候都进行垃圾回收。 随着时间的推移被用于数百MB的,我不得不重新加载页面或重新启动IE浏览器。

这小提琴能够重现该问题。 它使用AJAX请求一个页面,然后调用$(data) ,以夸大泄漏在紧密循环。 Chrome和Firefox似乎都作出反应,我预计(内存回收),但IE浏览器行为异常。 惊喜。

使用Process Explorer中,我看到运行上述小提琴短短两年时间后显着内存消耗的峰值。

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

这究竟是为什么? 有没有解决办法?

更新

这里有一个小提琴 ,演示了这个问题,而无需使用AJAX。

Answer 1:

我已经找到了解决办法了我上述问题。

在解决此,我尝试了各种东西,以防止泄漏的发生。 我想出了解决的办法是用沟$.ajax来检索数据和$()来包装的结果。 相反,我用$('#destination').load('sourceUrl #selector')见文档 )将数据推到一个隐藏的div,然后操纵结果的方式。

原来$.load使用$.parseHTML在幕后操作的结果,并在指定的位置推他们( $()显然没有)。 看到这里的源代码行。

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

这里有一个小提琴来证明。

我不知道为什么它的行为方式是这样的,但它的短似乎是:避免解析完整的HTML文档只要有可能。



Answer 2:

我看到你正在看到,当我改变了代码重新分配的功能,每次成功被调用,它奇迹般地不漏(ATLEAST在我的环境。)

所以,我的解决办法是愚蠢的,但它似乎为我工作。 对你起作用吗?

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



文章来源: Why does IE leak memory when wrapping an HTML response in a jQuery object?