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

简单的jQuery Ajax调用会泄漏Internet Explorer中的内存

甄越
2023-03-14
问题内容

我创建了一个网页,每秒进行一次Ajax调用。在Internet Explorer 7中,它严重泄漏内存(大约15分钟内20 MB)。

该程序非常简单。它只是运行一个进行Ajax调用的JavaScript函数。服务器返回一个空字符串,而JavaScript代码则不执行任何操作。我setTimeout过去每秒钟运行一次该函数,并且我正在使用Drip来观看该事件。

来源如下:

<html>
  <head>
    <script type="text/javascript" src="http://www.google.com/jsapi"></script>
    <script type="text/javascript">
      google.load('jquery', '1.4.2');
      google.load('jqueryui', '1.7.2');
    </script>
    <script type="text/javascript">
      setTimeout('testJunk()',1000);
      function testJunk() {
        $.ajax({ url: 'http://xxxxxxxxxxxxxx/test', // The url returns an empty string
                 dataType: 'html',
                 success: function(data){}
               });
        setTimeout('testJunk()',1000)
      }
    </script>
  </head>
  <body>
    Why is memory usage going up?
  </body>
</html>

如何堵塞这种泄漏?我有一个真正的应用程序,它会以这种方式更新大表,但是如果不加注意,它将占用数GB的内存。

编辑 :好的,所以在提出一些好的建议之后,我将代码修改为:

<html>
  <head>
    <script type="text/javascript" src="http://www.google.com/jsapi"></script>
    <script type="text/javascript">
      google.load('jquery', '1.4.2');
      google.load('jqueryui', '1.7.2');
    </script>
    <script type="text/javascript">
      setTimeout(testJunk,1000);
      function testJunk() {
        $.ajax({ url: 'http://xxxxxxxxxxxxxx/test', // The url returns an empty string
                 dataType: 'html',
                 success: function(data){setTimeout(testJunk,1000)}
               });
      }
    </script>
  </head>
  <body>
    Why is memory usage going up?
  </body>
</html>

不过,这似乎没有什么区别。我没有对DOM做任何事情,如果我注释掉Ajax调用,则内存泄漏将停止。因此,看起来泄漏完全在Ajax调用中。jQuery
Ajax是否会固有地创建某种循环引用?如果是,我如何释放它?顺便说一下,它不会在Firefox中泄漏。

有人建议在另一台VM上运行测试,然后查看结果是否相同。我没有设置另一台VM,而是发现了一台运行带有Internet Explorer 8的XP
Home的笔记本电脑。它出现了同样的问题。

我尝试了一些旧版本的jQuery并获得了更好的结果,但是直到我放弃jQuery中的Ajax并使用了更传统(更丑陋)的Ajax时,问题才完全消失。


问题答案:

问题似乎出在Internet Explorer中的jQuery 1.4,以及程度较小的1.2和1.3版本中。

1.4.0、1.4.1和1.4.2均出现严重的内存泄漏。

1.2.3、1.2.6、1.3.0、1.3.1和1.3.2都显示出小得多的泄漏(10分钟后大约100 KB)。

我还尝试了一种以更传统的方式调用Ajax的程序版本:

<html>
  <head>
    <script language="javascript" type="text/javascript">
      function getHTTPObject() {
        var xmlhttp;
        /*@cc_on
        @if (@_jscript_version >= 5)
          try {
            xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
          } catch (e) {
            try {
              xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (E) {
              xmlhttp = false;
            }
          }
        @else
        xmlhttp = false;
        @end @*/
        if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
          try {
            xmlhttp = new XMLHttpRequest();
            if (xmlhttp.overrideMimeType) {
              xmlhttp.overrideMimeType("text/xml"); 
            }
          } catch (e) {
            xmlhttp = false;
          }
        }
        return xmlhttp;
      }
      var ajaxObject = getHTTPObject();
      setTimeout(testJunk,1000);
      function testJunk() {
        ajaxObject.open('POST', 'http://XXXXXXXXXXXXXXX/delme2', true);
        ajaxObject.onreadystatechange = handleAjaxResponse;
        ajaxObject.send(null);
      }
      function handleAjaxResponse() {
        if (ajaxObject.readyState==4) {
          setTimeout(testJunk,1000);
        }
      }
    </script>
  </head>
  <body>
    <div id="test">Why is memory usage going up?</div>
  </body>
</html>

这完全消除了泄漏。

因此,看来我必须重复我的Ajax调用丑陋的旧方法,直到jQuery专家们解决了这个问题。



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

  • 问题内容: 导致Java内存泄漏的最简单方法是什么? 问题答案: 除非您执行以下操作,否则您实际上无法在Java中“泄漏内存”: 实习生字符串 生成类 jni调用的本机代码中的泄漏内存 在一些被遗忘或晦涩的地方保存对您不想要的事物的引用。 我认为您对最后一种情况感兴趣。常见方案是: 侦听器,尤其是内部类 缓存。 一个很好的例子是: 构建一个Swing gui,它可以启动数量不限的模态窗口; 让模态

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

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

  • 问题内容: 我多次问到这个问题。有什么好的答案 问题答案: Java中会不会发生内存泄漏? 答案是,这取决于您正在谈论的是哪种内存泄漏。 经典C / C ++内存泄漏是在应用程序或对象完成使用后忽略时发生的,并且会泄漏。循环引用是这种情况的一个子案例,其中应用程序很难知道何时使用/ ,因此忽略了这样做。相关问题是应用程序在释放对象后使用对象,或尝试释放对象两次。(您可以将后者称为内存泄漏,或者仅是

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