IE9内存泄漏问题

6
我注意到在Win7的IE进程中,每次页面刷新时与之相关的内存会增加20-30兆。一旦达到1.5GB,浏览器就会失去响应。我正在使用IE9,并且只能在IE9中重现此问题。Chrome、Firefox、IE7或IE8都没有这样的问题。事实上,在兼容模式下运行IE9也不会出现此问题。
特别是,我想知道即使在页面刷新后内存怎么可能泄漏。有人还见过这种情况吗?

1
这是一个相当棘手的问题。我猜可能有很多原因,抱歉 :-( - Sebas
1
无法为大型应用程序提供代码片段。如果我能提供片段,那么我已经得到了答案,因为这将要求我将问题缩小到代码的特定区域。正如我的问题所述,我正在寻找遇到与我相同情况的其他人:即使在页面重新加载后仍存在内存泄漏(仅限IE9),以及一些关于如何发生这种情况的解释,从一般意义上讲。 - Ray Nicholus
看看我的新答案 Ray,今天才解决了这个问题(在产品的最新版本中遇到了相同的问题)。 - Mark Pieszak - Trilon.io
2个回答

6

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

如果您正在使用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测试的返回语句需要更改,这样问题就会解决!

1
那正是我的问题,而你的建议救了我一命。实至名归的点赞! - dan radu
@dandradu 没问题 :) 是啊,这也让我疯狂了一段时间... 很高兴能帮到其他人! - Mark Pieszak - Trilon.io
1
哇...这么简单的解决方案,解决了困扰我们一段时间的问题。谢谢! - Jonathan Rupp
@JonathanRupp 很高兴能帮忙,是啊,这也让我疯了好几个星期...哈哈 - Mark Pieszak - Trilon.io

3
在过去,Internet Explorer在常规JavaScript变量和DOM对象之间的引用上存在一些问题。因此,如果我记得正确,像这样的循环引用
var e = document.createElement('div');
var x = { elementReference: e };
e.jsReference = x;
< p>即使没有其他对ex的引用,IE也不会将其进行垃圾回收。这是因为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个循环引用对象,但你可能创建了更大的对象,其中包含你还没有发现的某些循环引用。

这能解释每次页面重新加载时内存快速增长吗?我原本认为主机对象和本地对象之间的循环引用问题不会解释每次页面重新加载时内存增加的问题。此外,我没有明确创建任何循环引用。 - Ray Nicholus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接