【问题标题】:Using JavaScript with Internet Explorer, how do I clear memory without refreshing the page?在 Internet Explorer 中使用 JavaScript,如何在不刷新页面的情况下清除内存?
【发布时间】:2010-11-24 16:40:40
【问题描述】:

我有一个基于 AJAX 的网站,在客户端使用 JavaScript。站点上的某些操作会缓存来自浏览器中服务调用的大型结果集(即数百兆字节)。这些都是一次性的结果。它们将被查看一小段时间,然后需要从内存中清除。

我编写了一个小型测试站点,它在内存中加载一堆垃圾,然后调用 JavaScript 的 delete 方法。这在 Firefox 中效果很好(内存几乎立即返回)。 Internet Explorer 8(尚未尝试 7)在页面刷新或关闭之前不会释放内存。

有谁知道如何使用 JavaScript/Ajax(无页面刷新)降低 IE 的内存使用量?

下面是我的示例客户端代码:

function load() {
 var x = ['dfjasdlfkjsa;dflkjsad;flkjsadf;lj'];

 for( var i = 0; i < 10000000; ++i ) {
  x.push('asdfasfasfsfasdfkasjfslafkjslfjsalfjsaldfkjasl;dfkjsadfl;kjsdflskajflskfjslakfjaslfkjsaldfkjsaldfksdfjk');
 }

 alert('deleting');   // <--- memory usage around 500mb
 delete x;            // <--- immediate results in Firefox 3.5 (not IE8)
 alert('done');
}

更新: 将变量设置为“null”不会立即清除内存(因为这由垃圾收集器决定)。此外,将变量设置为 null 只会获得一个引用,而其中可能有多个引用。

【问题讨论】:

    标签: javascript ajax internet-explorer memory memory-management


    【解决方案1】:

    IE(嗯,从技术上讲,JScript)有an undocumented CollectGarbage method,据说强制垃圾收集器立即运行。您可能想尝试一下,但根据我的经验,nulling 引用在大多数情况下就足够了。

    【讨论】:

      【解决方案2】:

      不使用删除方法,而是将变量设置为null。这似乎是清除跨浏览器内存的最佳方法(delete 是出了名的不稳定)。它与我的其他答案 here 的工作原理相同。

      alert('deleting');   // <--- memory usage around 500mb
      x = null;
      alert('done');
      

      【讨论】:

        【解决方案3】:

        如果你尝试“x= null;”而不是删除?

        【讨论】:

        • 但是如果我有多个变量指向同一个对象呢? Null 只会终止单个引用。
        • @j0rdan 当您对一个对象有多个引用时,垃圾收集器显然不会垃圾收集该对象,直到所有引用都被抓住存在。 null'ing 所有对对象的引用只是让 GC 知道 它可用于垃圾收集,并且可以在下次 GC 运行时清除
        【解决方案4】:

        只需将 null 分配给变量:

        x = null;
        

        【讨论】:

        • 但是如果我有多个变量指向同一个对象呢? Null 只会终止单个引用。
        • 是的,你是对的,如果是这样的话,因为删除操作符在 IE 上不能很好地工作,你可以取消你创建的所有对对象的引用,这就是拥有的代价一个有问题的垃圾收集器......如果可以的话,鼓励你的用户使用一个好的浏览器:-)
        【解决方案5】:

        我意识到您提到数据被丢弃,但是,当您删除节点时,即使只是将 x 设置为 null,您也需要确保没有事件处理程序附加到任何节点,否则该节点不能被垃圾收集。

        这是我在自己的代码中使用的一个函数: http://javascript.crockford.com/memory/leak.html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-02-20
          • 2016-05-05
          • 2010-11-26
          • 2017-05-11
          • 2019-11-25
          相关资源
          最近更新 更多