jquery ajax内存泄漏

时间:2013-02-22 20:17:42

标签: jquery ajax memory-leaks

我绝对不是第一个遇到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

我一直在不断地拍摄堆快照,以上都没有影响泄漏

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() {}