我想弄清楚为什么IE包裹的AJAX-LY请求HTML页面的jQuery对象进行处理时,泄漏内存。 用户可以访问该页面,并让它坐了好几分钟或几小时,所以该页面使用jQuery的ajax
方法几次一分钟,以获得新的数据,然后我用新的预渲染数据替换页的重要组成部分。
在这一点上,我已经将范围缩小到一个单一的电话-当$(data)
被调用来包装HTML字符串,内存尖刺了一下,似乎没有以往任何时候都进行垃圾回收。 随着时间的推移被用于数百MB的,我不得不重新加载页面或重新启动IE浏览器。
这小提琴能够重现该问题。 它使用AJAX请求一个页面,然后调用$(data)
,以夸大泄漏在紧密循环。 Chrome和Firefox似乎都作出反应,我预计(内存回收),但IE浏览器行为异常。 惊喜。
使用Process Explorer中,我看到运行上述小提琴短短两年时间后显着内存消耗的峰值。
我目前在标准模式下使用IE9。
这究竟是为什么? 有没有解决办法?
更新
这里有一个小提琴 ,演示了这个问题,而无需使用AJAX。
我已经找到了解决办法了我上述问题。
在解决此,我尝试了各种东西,以防止泄漏的发生。 我想出了解决的办法是用沟$.ajax
来检索数据和$()
来包装的结果。 相反,我用$('#destination').load('sourceUrl #selector')
见文档 )将数据推到一个隐藏的div,然后操纵结果的方式。
原来$.load
使用$.parseHTML
在幕后操作的结果,并在指定的位置推他们( $()
显然没有)。 看到这里的源代码行。
-
$(htmlText)
泄漏 -
$(bodyText)
不泄漏 -
$.parseHtml(htmlText)
慢慢泄漏(?) -
$.parseHtml(bodyText)
不泄漏
这里有一个小提琴来证明。
我不知道为什么它的行为方式是这样的,但它的短似乎是:避免解析完整的HTML文档只要有可能。
我看到你正在看到,当我改变了代码重新分配的功能,每次成功被调用,它奇迹般地不漏(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/