Array.splice会导致内存泄漏吗?

时间:2016-04-25 12:21:06

标签: javascript arrays memory-leaks

我目前正在尝试解决我们的Javascript产品上的一些内存问题,我想知道是否有可能通过splice方法从数组中删除项目可能导致任何内存泄漏或者是它相当于null要删除的值? 如果数组存储在全局范围内,它会改变什么吗?

例如代码段1:

var myArray = [...]; // init the array;
myArray.splice(indexOfTheItemToRemove, 1);

vs snippet 2:

var myArray = [...]; // init the array;
var temp = myArray.splice(indexOfTheItemToRemove, 1);
temp.length = 0;
temp = null;

谢谢。

1 个答案:

答案 0 :(得分:3)

根据Mozilla Developer Network

  

某些函数调用会导致对象分配。

所以,确实在splice电话上有一个内存分配。

然而,Javascript有一个垃圾收集器,它引导我们进入文章的下一部分:

  

这是最天真的垃圾收集算法。该算法减少了#34的定义;不再需要对象" to"一个对象没有引用它的其他对象"。如果指向此对象的引用为零,则该对象被视为可以收集垃圾。

果然,只要我们不将函数的结果赋给变量,就没有对它的引用。因此,垃圾收集器可以轻松释放分配的内存。

我们可以通过在浏览器中运行这段代码来轻松检查我们的假设:

var myArray;
var cycles = 100000;
var delay = 10;

(function step() {
  myArray = ['a', 'b', 'c'];
  myArray.splice(1, 1);

  if (--cycles > 0) {
    setTimeout(step, delay);
  }
}());

我们可以检查Chrome开发工具上的内存分配' Timeline标签。

enter image description here

尖峰指向内存释放事件,我们可以看到内存消耗级别返回其初始状态。

所以答案是:不,这里没有内存泄漏。