79 可读性
 将光标移到文章中的句子上,可以查看原文。 显示译文      显示原文      双语对照

分享 |
为什么jquery泄漏内存?
Why does jquery leak memory so badly?

60 0

这是某种追踪到我上星期发布的问题: http://stackoverflow .com/questions/2429056/s我plejquery中ajax调用内存漏洞的ie?

我喜欢jquery的语法及其所有出色的特性,可我一直对此通过ajax调用的页面会自动更新表格单元格不能泄露内存。

所以我创建了两个简单的测试页来试验。 这两个页面都会做一个ajax调用.1秒。 每次ajax调用成功后,计数器就会递增,然后DOM将更新。 1000个周期后停止的脚本。

一个使用jquery来实现ajax调用和更新DOM 。 另一种是使用ajax,并对其执行的Yahoo API文档.getElementById( 。。。) .innerHTML更新DOM 。

jquery版本内存漏洞的坏得很厉害。 在水滴( 在运行XP Home内存增长呈线性增长和IE7 ),它在有关48MB 9MB处开始,结束,在这段时间里, 如果我注释掉的行更新简单DOM DOM,甚至还于32MB完成,这样一来,更新泄漏大量的内存。 在DOM 9MB,不管它的非jquery版本时开始并完成更新。

急谁有好的解释是什么导致jquery泄漏? 好像少了点明显? 有没有循环引用,对不起,我不懂? 或者跟jquery就有一些严重的内存问题?

这是的源代码泄漏的( jquery ) 版本:

<html>
  <head>
    <script type="text/javascript" src="http://www.google.com/jsapi"></script>
    <script type="text/javascript">
      google.load('jquery', '1.4.2');
    </script>
    <script type="text/javascript">
      var counter = 0;
      leakTest();
      function leakTest() {
        $.ajax({ url: '/html/delme.x',
                 type: 'GET',
                 success: incrementCounter
               });
      }
      function incrementCounter(data) {
        if (counter<1000) {
          counter++;
          $('#counter').text(counter);
          setTimeout(leakTest,100);
        }
        else $('#counter').text('finished.');
      }
    </script>
  </head>
  <body>
    <div>Why is memory usage going up?</div>
    <div id="counter"></div>
  </body>
</html>

这里就是我们的非泄漏的版本:

<html>
  <head>
    <script type="text/javascript" src="http://yui.yahooapis.com/2.8.0r4/build/yahoo/yahoo-min.js"></script>
    <script type="text/javascript" src="http://yui.yahooapis.com/2.8.0r4/build/event/event-min.js"></script>
    <script type="text/javascript" src="http://yui.yahooapis.com/2.8.0r4/build/connection/connection_core-min.js"></script>
    <script type="text/javascript">
      var counter = 0;
      leakTest();
      function leakTest() {
        YAHOO.util.Connect.asyncRequest('GET',
                                        '/html/delme.x',
                                        {success:incrementCounter});
      }
      function incrementCounter(o) {
        if (counter<1000) {
          counter++;
          document.getElementById('counter').innerHTML = counter;
          setTimeout(leakTest,100);
        }
        else document.getElementById('counter').innerHTML = 'finished.'
      }
    </script>
  </head>
  <body>
    <div>Memory usage is stable, right?</div>
    <div id="counter"></div>
  </body>
</html>
时间: 15年08月05日 原作者: Thomas Lane
你现正使用JQuery的哪个版本?
Firefox中将会发生什么呢?
他打开1 代码段.4 .2
1 版.4 .2,仅在IE中。
本应该是固定在1 .5 .0在ajax重写,这是一个已知的bug,会在2009年2 月该错误的修复系统。

7 0

我最初的想法可能是,那一定和jquery ajax的方式方法执行下列操作之一:

a 。 IE创建循环引用,尤其是糟糕的。

b 。 创建内部对象的属性无法删除的,因为他们的方式创建表并DontDelete的设置属性。 请参见下面的更多信息: http://perfectionkills .com/understanding delete/

无论采用哪种方式,垃圾回收器就无法接收到废纸篓中,得到的结果为一个逃跑的可疑的内存泄漏,特别是当函数正在执行的频率。

发布时间: 15年08月05日 原作者: Jessica Jacobs
...