我正在试图弄清楚为什么IE在jQuery对象中包装AJAX-ly请求的HTML页面进行处理时泄漏内存。用户可以访问该页面并让它静置几分钟或几小时,因此该页面每分钟使用jQuery的ajax
方法几次获取新数据,然后我用新的pre替换页面的重要部分 - 数据。
此时,我已将其缩小为单个调用 - 当调用$(data)
来包装HTML字符串时,内存会出现一点点,并且似乎不会被垃圾回收。随着时间的推移,使用了数百MB,我不得不重新加载页面或重新启动IE。
This fiddle能够重现此问题。它使用AJAX来请求页面,然后在紧密循环中调用$(data)
以夸大泄漏。 Chrome和Firefox似乎都像我期望的那样做出反应(内存被回收),但IE表现得很糟糕。惊喜。
使用Process Explorer,我发现只有两次运行上述小提琴后,内存消耗量会大幅增加。
我目前在标准模式下使用IE9。
为什么会这样?有解决方法吗?
这是一个fiddle,它在不使用AJAX的情况下演示了这个问题。
答案 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();
}
});
}