IE9内存泄漏

Ray*_*lus 6 javascript internet-explorer-9

我注意到,在我的应用程序中,与每个页面刷新的Win7上的IE进程相关的内存增加了20-30 MB.一旦达到约1.5 GB,浏览器就会无法响应.我正在使用IE9,并且只能在IE9中重现这一点.在Chrome,FF,IE7或IE8中没有此类问题.实际上,在兼容模式下运行IE9时也不会出现此问题.

特别是,我想知道即使页面刷新后内存也会泄漏.有没有人见过这个?

Mar*_*.io 6

我不确定这是否是你的问题,但我也得到了IE9内存泄漏问题,内存不断增长和增长(每次刷新/页面更改大约20mgs).

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

现代问题出现在Modernizr/Geolocation和IE9上,它实际上是IE9的继承问题,而不是Modernizr.

return 'geolocation' in navigator
Run Code Online (Sandbox Code Playgroud)

代替:

return !!navigator.geolocation // this causes the memory leak (silly IE9)
Run Code Online (Sandbox Code Playgroud)

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

看看那个链接,但基本上Geolocation测试的return语句需要改变,这个问题将自行解决!


Imp*_*Imp 3

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

var e = document.createElement('div');
var x = { elementReference: e };
e.jsReference = x;
Run Code Online (Sandbox Code Playgroud)

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

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

e.jsReference = null;
x.elementReference = null;
Run Code Online (Sandbox Code Playgroud)

编辑:在 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>
Run Code Online (Sandbox Code Playgroud)

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

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

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