当前位置: 首页 > 面试题库 >

jQuery AJAX调用中的内存泄漏

邹铭
2023-03-14
问题内容

我编写了一个聊天框小部件,它每秒运行一次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();

有人可以看一下我的(基本)代码,看看是否可以发现发生内存泄漏的地方以及我做错了什么?我是否需要取消设置某些变量或其他内容?

非常感谢!


问题答案:

切勿setInterval()与ajax一起使用,否则您的请求将永远不会保持同步。使用setTimeout()代替,然后挂起您的逻辑,setTimeout()complete回调中递归地启动。

例。

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


 类似资料:
  • 问题内容: 我有一个在django中运行的小型多线程脚本,随着时间的流逝,它开始使用越来越多的内存。将其保留一整天会消耗大约6GB的RAM,我开始进行交换。 在http://www.lshift.net/blog/2008/11/14/tracing-python-memory- leaks 之后,我将其视为最常见的类型(仅使用800M内存): 这没有什么奇怪的。我现在应该怎么做才能帮助调试内存问

  • 我尝试用一个大表(大约一万条记录)中的记录填充JdbcRowSet。我尝试了两个变体(参见下面的代码): 创建连接对象,使用JdbcRowSetImpl(connection)实例化,在循环中执行查询。 使用JdbcRowSetImpl(DriverManager.GetConnection(“jdbc:....”)实例化,在循环中执行查询。 第一个变体会导致内存泄漏,直到堆满为止。第二个变体没有

  • 问题内容: 有效的Java说: 内存泄漏的第三个常见来源是侦听器和其他回调。如果在客户端注册回调但未显式注销的情况下实现API,除非您采取某些措施,否则它们会累积。确保回调被及时垃圾回收的最佳方法是仅存储对其的弱引用,例如,通过仅将它们作为键存储在WeakHashMap中。 我是Java的初学者。有人可以教我如何在回调中创建弱引用,并告诉我它们如何解决内存泄漏问题吗?谢谢。 问题答案: 阅读这篇文

  • 我使用石英版和Spring Boot版。它表现正常,一切正常。但是当我试图关闭这个应用程序时,问题出现了。日志显示有内存泄漏... 我的石英配置; 我有两个班,执行如下工作; 另一个班也同样做着不同的事情。 调度器工厂Bean如下; 我得到了像下面这样的tomcat日志; 查阅了quartz文档,并在properties中添加了以下内容:; 第一条线程消息消失了,但关于worker-2的第二条消息

  • 问题内容: 我创建了一个网页,每秒进行一次Ajax调用。在Internet Explorer 7中,它严重泄漏内存(大约15分钟内20 MB)。 该程序非常简单。它只是运行一个进行Ajax调用的JavaScript函数。服务器返回一个空字符串,而JavaScript代码则不执行任何操作。我过去每秒钟运行一次该函数,并且我正在使用Drip来观看该事件。 来源如下: 如何堵塞这种泄漏?我有一个真正的应

  • 我有一个在Tomcat7上运行的web应用程序的问题。 当我尝试重新启动web应用程序时,我在servlet内部创建的线程打开的端口仍然是打开的。 “http-bio-8080-acceptor-0”后台进程prio=10 tid=0x00007F4ED4206000 nid=0x71f0 runnable[0x00007F4ECC78F000]java.lang.thread.state:run