我绝对不是第一个遇到jQuery内存泄漏问题的人,但我找不到答案,我正在寻找类似于我所看到的这个问题的许多问题。
首先,泄漏位:
$(document).ready(function ivr_grabber(){
var xhr = $.ajax({
url: '/ivr/inprogress',
timeout: 3000,
success: function(data){
$('#open-ivrs').html(data);
data = null;
},
complete: function(){
setTimeout(ivr_grabber, 3000);
}
});
xhr = null;
});
PHP代码返回一个表,其中包含一些由我们的PBX调用的人。我已经注释掉.html(数据)行了,它没有任何区别。我也删除了setTimeout,然后把它放回去,没有运气。我试图取消所有可能导致这种泄漏的价值,但我无法弄清楚它的来源。
它似乎以每个ajax呼叫大约5 KB的速率泄漏。有什么想法吗?
在chrome上使用jQuery 1.7.2
我一直在不断地拍摄堆快照,以上都没有影响泄漏
答案 0 :(得分:4)
我想出了内存泄漏问题。它在:
setTimeout();
我正在调用一个调用该函数的函数名,然后设置一个超时来调用该函数。不断升级的超时堆积起来。实际上我需要使用匿名函数,如下所示:
setTimeout(function(){
some_func();
}, 5000);
编辑:这实际上并没有解决jQuery的ajax方法容易产生的微小的固有句柄累积。我还没有想过要解决这个问题。
编辑2:我遇到的导致内存泄漏的另一个问题是挂载事件处理程序。重新定义事件处理程序,如下所示:$('#something').click(function(){ do stuff });
不会删除旧的.click()处理程序,我发现使用.unbind('click')解决了我遇到的许多问题。
答案 1 :(得分:0)
我对此并不是100%肯定,但尝试在document.ready处理程序范围之外声明函数ivr_grabber。另外,为什么将jqXHR对象设置为null?这根本不会实现,也许会干扰异步请求。
$(document).ready(ivr_grabber);
function ivr_grabber() {}