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

标签 jquery ajax memory-leaks

我创建了一个每秒进行一次 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>

如何堵住这个漏洞?我有一个真实的应用程序,可以通过这种方式更新一个大表,但如果无人看管,它将耗尽千兆字节的内存。

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

<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 中不会泄漏。

有人建议在另一个虚拟机中运行测试,看看结果是否相同。我没有设置另一个虚拟机,而是找到了一台运行 XP Home 和 Internet Explorer 8 的笔记本电脑。它也出现了同样的问题。

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

最佳答案

这是一个link jQuery 上的错误,以及 jQuery 1.4.2 的建议修复:

--- jquery-1.4.2.js     2010-04-08 12:10:20.000000000 -0700
+++ jquery-1.4.2.js.fixed       2010-04-08 12:10:38.000000000 -0700
@@ -5219,7 +5219,7 @@

                            // Stop memory leaks
                            if ( s.async ) {
-                                       xhr = null;
+                                       xhr.onreadystatechange = null; xhr.abort = null; xhr = null;
                            }
                    }
            };

注意:这已在 jQuery 1.4.4 中正式修复,因此您最好的选择是立即升级。

关于jquery - 简单的 jQuery Ajax 调用会泄漏 Internet Explorer 中的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2429056/

相关文章:

javascript - 动画持续时间的鼠标悬停问题

javascript - 从模块构建 jQuery DOM 元素

javascript - 如何在不同 session 中绑定(bind)多个复选框

javascript - ajax上传后获取图片大小

c++ - 可以手动泄漏内存吗?

javascript - 获取用户尝试返回的页面的 url

javascript - 使用 jQuery 对来自几个文本输入的值求和

jquery - 如何同步两个嵌套的jquery foreach循环?

c++ - 从C++中的链表中删除指针

c# - XmlSerializer.FromTypes 产生内存泄漏?