【问题标题】:jquery ajax memory leakjquery ajax 内存泄漏
【发布时间】:2013-02-22 20:17:42
【问题描述】:

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

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

【问题讨论】:

  • 为什么要将 ajax 调用添加到 xhr 变量中?
  • 供以后使用。我试过不将它分配给 xhr 变量,但泄漏仍然存在。
  • 您使用的是什么版本的 jQuery?能否通过将成功中的代码从成功中提取并直接运行多次来重新创建问题?
  • 为什么你认为有内存泄漏?
  • 成功的代码不是问题,是完整的代码。该代码只是设置超时,并在超时消失时再次运行该函数。不过,我会尝试在 ajax 之外运行它。

标签: jquery ajax memory-leaks


【解决方案1】:

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

setTimeout();

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    $(document).ready(ivr_grabber);
    function ivr_grabber() {}
    

    【讨论】:

    • 我会试试然后回到这个
    • 没有骰子,内存泄漏仍然存在。
    猜你喜欢
    • 2012-10-25
    • 2023-04-08
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    相关资源
    最近更新 更多