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

防止AJAX内存泄漏

蓝飞
2023-03-14
问题内容

我正在设计一个Web应用程序,该应用程序旨在显示一堆使用AJAX定期更新的数据。一般的使用场景是用户将整天保持打开状态,然后不时浏览一下。

我遇到的问题是浏览器的内存占用量随时间缓慢增长。Firefox和IE
7(尽管不是Chrome)都在发生这种情况。几个小时后,它可能导致IE7占用约200MB的内存,而FF3导致占用约400MB的内存。

经过大量测试,我发现只有在响应AJAX调用时才会发生内存泄漏。如果服务器没有任何响应,我可以将页面保持打开状态数小时,并且占用空间不会增加。

我正在为AJAX调用使用原型。因此,我猜测onSuccess回调在创建这些内存泄漏时存在问题。

有没有人对使用原型/ AJAX防止内存泄漏有任何提示?或任何方法如何解决此问题?

编辑:发现问题出在我正在使用的js图形库中。可以在这里看到。


问题答案:

您可以注意的最大事件是事件及其分配方式。

例如,采用这种情况(因为您尚未提供):

<div id="ajaxResponseTarget">
    ...
</div>
<script type="text/html" target="_blank">javascript">
    $(someButton).observe('click', function() {
        new Ajax.Updater($('ajaxResponseTarget'), someUrl, {
            onSuccess: function() {
                $$('#ajaxResponseTarget .someButtonClass').invoke('observe', 'click', function() {
                    ...
                });
            }
        });
    });
</script>

这将导致内存泄漏,因为在进行#ajaxResponseTarget更新时(内部,Prototype将使用innerHTML)带有click事件的元素将从文档中删除而不会删除其事件。第二次单击someButton,您将获得两倍的事件处理程序,并且垃圾回收无法删除第一组事件处理程序。

避免这种情况的一种方法是使用事件委托:

<div id="ajaxResponseTarget">
    ...
</div>
<script type="text/javascript">
    $('ajaxResponseTarget').observe('click', function(e) {
        if(e.element().match('.someButtonClass')) {
            ...
        }
    });
    $(someButton).observe('click', function() {
        new Ajax.Updater($('ajaxResponseTarget'), someUrl);
    });
</script>

由于DOM事件的工作方式,.someButtonClass也会在上触发“ click”
#ajaxResponseTarget,并且Prototype使确定事件目标的元素变得非常简单。没有事件被分配到元素 之内
#ajaxResponseTarget,所以也没有办法为内目标替换它的内容,以孤儿的活动。



 类似资料:
  • 问题内容: 我们知道node.js为我们提供了强大的功能,但强大的功能带来了巨大的责任。 据我所知,V8引擎不进行任何垃圾收集。因此,我们应该避免什么最常见的错误,以确保没有内存从节点服务器泄漏。 编辑: 对不起,V8确实具有强大的垃圾收集器。 问题答案: 据我所知,V8引擎不进行任何垃圾收集。 V8内置了强大而智能的垃圾收集器。 您的主要问题是不了解闭包如何维护对外部函数的范围和上下文的引用。这

  • 问题内容: 我在Java中的总的初学者和已经创建了一个简单的Java的Android片断其中一个Runnable 1,5秒钟后,我改变从到。它工作正常,基本上应该防止这种内存泄漏发生吗?我怀疑在发生设备定向时是否绝对没有内存泄漏。我很乐意对此进行检查,但无法在模拟的Android中更改方向。 这是代码: 编辑 它可以防止内存泄漏,但也有一些答案与UI线程阻塞有关。实际上,此代码在主(UI)线程中运

  • 我正在使用org.AsynchTtpClient发布异步请求。 在关闭tomcat时,我得到了以下日志: 严重:web应用程序[/test]似乎启动了一个名为[pool-1-thread-1]的线程,但未能停止它。这很有可能造成内存泄漏。 2017年7月4日10:53:00 AM org.apache.catalina.loader.webappclassloaderbase clearRefer

  • 我的模板如下所示 现在,当我试图在注释字段“今天的天气预报是”中使用以下字符串构建模板时,velocity最终将其呈现为 我如何防止它逃脱我的角色?

  • 我有从我的网页生成的AJAX POST请求,可能有多个POST请求具有相同的POST数据。但是响应可能会有所不同,我希望确保我没有得到这些请求的缓存响应。我需要每个请求点击网页。 我假设对POST请求的响应不会被缓存,这对吗?

  • 问题内容: 我编写了一个聊天框小部件,它每秒运行一次ajax调用,以获取已发布的新消息。问题在于它正在泄漏内存,仅在打开大约15分钟后便崩溃了我的浏览器(Firefox)。 可能是我,因为我是相对的新手,所以我确定自己错过了某些事情,或者没有设置变量等。 有人可以看一下我的(基本)代码,看看是否可以发现发生内存泄漏的地方以及我做错了什么?我是否需要取消设置某些变量或其他内容? 非常感谢! 问题答案