【问题标题】:IE9 memory leakIE9 内存泄漏
【发布时间】:2012-05-15 18:05:10
【问题描述】:

我注意到,在我的应用程序中,与 Win7 上的 IE 进程相关的内存在每次页面刷新时都会增加 20-30 MB。一旦我达到大约 1.5 GB,浏览器就会变得无响应。我使用的是 IE9,只能在 IE9 中重现。 Chrome、FF、IE7 或 IE8 中没有此类问题。事实上,在兼容模式下运行 IE9 时也不会出现该问题。

特别是,我想知道即使在页面刷新之后内存也会泄漏。有没有其他人看过这个?

【问题讨论】:

  • 这是一个很难解决的问题。我想这可能有很多原因,对不起:-(
  • 无法为大型应用程序提供代码 sn-ps。如果我可以提供 sn-ps,我已经有了答案,因为这需要我将问题缩小到代码的特定区域。正如我的问题所述,我正在寻找与我遇到相同情况的其他人:即使在页面重新加载后内存泄漏(仅限 IE9),以及一般意义上的关于如何发生这种情况的一些解释。
  • 查看我的新答案 Ray,今天才发现这个问题(与最新版本的产品有同样的问题)

标签: javascript internet-explorer-9


【解决方案1】:

我不确定这是否是您的问题,但我也遇到了 IE9 内存泄漏问题,内存不断增长(每次刷新/页面更改大约 20 毫克)。

如果您使用的是 Modernizr(这应该在最近的版本之一中修复,我相信 2.5+),但如果您使用的是旧版本(并且不能出于任何原因更新它),那么所有你需要做的是替换一个return 语句。

Modernizr / Geolocation & IE9 出现问题,这实际上是 IE9 的继承问题,而不是 Modernizr。

return 'geolocation' in navigator

代替:

return !!navigator.geolocation // this causes the memory leak (silly IE9)

https://github.com/Modernizr/Modernizr/issues/513

看看那个链接,但是基本上Geolocation测试的return语句需要改一下,这个问题会自己解决的!

【讨论】:

  • 那是我的问题,你的建议救了我。当之无愧的投票!
  • @danradu 随时 :) 是的,这也让我发疯了一段时间......很高兴它帮助了其他人!
  • 哇...这么简单的解决方案解决了困扰我们一段时间的问题。谢谢!
  • @JonathanRupp 很高兴能帮上忙,是的,这也让我发疯了好几个星期……哈哈
【解决方案2】:

过去,Internet Explorer 在普通 JavaScript 变量和 DOM 对象之间的引用方面存在一些问题。所以,如果我没记错的话,像这样的循环引用

var e = document.createElement('div');
var x = { elementReference: e };
e.jsReference = x;

不会被垃圾回收,即使没有其他对 ex 的引用。这是因为 IE 对 DOM 元素和 JavaScript 使用了不同的垃圾回收方法。

现在,我相信这个问题已经在更高版本的 IE 中得到了解决,但也许不是。尝试查找所有此类有问题的引用,如果不再需要它们,请手动删除它们。

e.jsReference = null;
x.elementReference = null;

编辑:在 IE 8 中测试

我写了这个简单的测试网页。

<html>
  <head>
    <title>Leak test</title>
    <script>
      function leak() {
        var e = document.createElement('div');
        var x = { elementReference: e };
        e.jsReference = x;
      }

      function test() {
        for (var i = 0; i < 10000; i++)
          leak();
        alert('Done');
      }
    </script>
  </head>
  <body>
    <input type="button" value="test" onclick="test();" />
  </body>
</html>

我在 IE 8 中对此进行了测试,因为我没有在这台机器上安装 IE 9。但是,这仍然可能是相关的,因为它表明即使在最新版本的 IE 中仍然存在该问题,因此即使在 IE 9 中也可能持续存在。

我打开页面查看了内存使用情况。每次按下按钮后,内存使用量都会增加几 MB。刷新网页后,完全没有任何反应。关闭IE后,内存使用恢复到原来的状态。

您可以在 IE 9 中亲自尝试。当然,您可能不会在代码中分配 10000 个循环引用对象,但您可能会创建更大的对象,其中可能包含一些您尚未找到的循环引用。

【讨论】:

  • 这是否可以解释每次重新加载页面时内存快速增长的原因?我的印象是主机对象和本机对象之间的循环引用问题并不能解释每次重新加载页面时内存的增加。另外,我没有明确创建任何循环引用。
  • @user486979 编辑了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
  • 2013-01-20
  • 2011-10-31
相关资源
最近更新 更多