【问题标题】:Memory leak in jQuery AJAX callsjQuery AJAX 调用中的内存泄漏
【发布时间】:2013-03-14 15:56:26
【问题描述】:

我编写了一个聊天框小部件,它每秒运行一次 ajax 调用,以获取已发布的新消息。问题是它正在泄漏内存,并且仅在打开大约 15 分钟后,它就会使我的浏览器 (Firefox) 崩溃。

这可能是我,因为我是一个相对新手,我确定我错过了一些东西或者没有取消我的变量等。

var chat = {}
chat.fetchMessages = function() {
    $.ajax({
        url: '/chat_ajax.php',
        type: 'post',
        data: { method: 'fetch'},
        success : function(data) {
            $('#chat .messages').html(data);
            $("#chat").scrollTop($("#chat")[0].scrollHeight);
        }
    });
}
chat.interval = setInterval(chat.fetchMessages, 1000);
chat.fetchMessages();

有人可以看看我的(基本)代码,看看你是否能发现内存泄漏发生在哪里,以及我做错了什么?我需要取消设置一些变量吗?

非常感谢!

【问题讨论】:

  • 什么版本的jQuery?如果你包含 jQuery 1.9.1,它还会出现吗?旧版本的 jQuery 有一个内部缓存,用于存储简单的 html 字符串,然后当开发人员使用上述代码时,它会产生似乎是内存泄漏,因为缓存永远不会被清除。
  • 我不明白的是 $('#chat .messages').html(data);你总是通过 AJAX 请求获得整个聊天内容吗?我认为您应该只请求用户尚未阅读的部分将其附加到.messages。否则数据最终将是一个巨大的文本。

标签: jquery ajax memory-leaks setinterval


【解决方案1】:

永远不要在 ajax 中使用 setInterval(),否则您的请求永远不会保持同步。请改用setTimeout(),然后等待您的逻辑,在complete 回调中递归地启动setTimeout()

示例。

$(DoMyAjax); // start your ajax on DOM ready
function DoMyAjax() {
   $.ajax({ 
      complete: function() {
          // your logic here
          setTimeout(DoMyAjax, 1000);
      }
   });
}

【讨论】:

  • 这实际上增加了内存泄漏 - 现在它是每秒兆字节而不是千字节!
  • @NeilHillman 这是 Helga 所说的情况吗?似乎它会基于上述评论之一,即 jQuery 保留一个永远不会清除自身的 html 字符串缓存
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 2014-02-18
  • 2012-10-25
  • 2023-04-08
  • 1970-01-01
  • 2012-04-24
相关资源
最近更新 更多