在测试我们的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)