4

我绝对不是第一个遇到 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(data) 行,它没有任何区别。我也删除了setTimeout,然后放回去,没有运气。我试图取消设置可能导致此泄漏的所有值,但我无法弄清楚它来自哪里。

它似乎以每个 ajax 调用约 5 KB 的速率泄漏。有什么想法吗?

在 Chrome 上使用 jQuery 1.7.2

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

4

2 回答 2

4

我发现了内存泄漏问题。它是在:

setTimeout();

我正在调用一个函数名,它调用该函数,然后设置一个超时来调用该函数。有不断升级的超时堆积。实际上,我需要使用匿名函数,如下所示:

setTimeout(function(){
    some_func();
}, 5000);

编辑:这实际上并没有解决 jQuery 的 ajax 方法容易产生的微小的固有句柄积累。我还没有想办法解决这个问题。

编辑 2:我遇到的另一个导致内存泄漏的问题是挂载事件处理程序。像这样重新定义事件处理程序:

$('#something').click(function(){ do stuff });

不会删除旧的 .click() 处理程序,我发现使用 .unbind('click') 解决了我遇到的许多问题。

于 2013-03-07T23:52:48.347 回答
0

我对此不是 100% 确定的,但请尝试在 document.ready 处理程序的范围之外声明函数 ivr_grabber。另外,为什么将 jqXHR 对象设置为 null?据我所知,这没有任何作用,并且可能会干扰异步请求。

$(document).ready(ivr_grabber);
function ivr_grabber() {}
于 2013-02-22T20:20:01.473 回答