相关疑难解决方法(0)

IE10 setInterval内存泄漏的解决方法

在测试我们的Javascript库时,我认为我们在IE10(v10.0.9200.16519 - Windows 8 64位)Javascript实现中发现了严重的内存泄漏setInterval.

一个简单的测试用例表明,如果在作为参数传递的函数的闭包中捕获变量以供稍后执行,它似乎没有资格进行垃圾收集,即浏览器似乎仍然保留对函数的引用或至少关闭变量.

我们的测试用例setInterval只执行一次函数,然后清除间隔计时器,即一段时间后没有代码再运行,并且不再可以访问任何变量(据我所知,在此代码中没有引入全局变量,除了运行方法在onload),然而这一过程需要高达(取决于迭代次数)一半的存储器中的千兆字节.

有趣的是,如果我们使用这不会发生setTimeout,而不是方法(和问题并没有看起来在IE9存在,而Chrome,FF的当前版本).

这个小提琴可以看出这个问题.

在Windows 8上的IE10的新实例中运行它并打开任务管理器以查看内存使用情况.它将快速增长到350兆字节,并将在脚本执行后留在那里.

这是有问题的代码片段的重要部分:

// the function that when called multiple times will cause the leak in IE10
var eatMemory = function() {
    var a = null; // the captured closure variable
    var intervalId = setInterval(function() {
       a = createBigArray(); // call a method that allocates a lot of memory
       clearInterval(intervalId); // stop the interval timer
    }, 100);
} …
Run Code Online (Sandbox Code Playgroud)

javascript internet-explorer memory-leaks

11
推荐指数
1
解决办法
6328
查看次数