6

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

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

4

2 回答 2

6

我不确定这是否是您的问题,但我也遇到了这个 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 测试的返回语句需要更改,这个问题会自行解决!

于 2012-10-16T16:25:14.583 回答
3

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

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

即使没有其他对eand的引用,也不会被垃圾收集x。这是因为 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 个循环引用对象,但您可能会创建更大的对象,其中可能包含一些您尚未找到的循环引用。

于 2012-05-15T18:15:39.457 回答