释放大型阵列内存的正确方法是什么

时间:2019-03-14 15:24:15

标签: javascript arrays

我正在使用画布进行图像处理。

用户每次将选择10张照片(通常是高分辨率照片),然后脚本将在将这些照片上传到服务器之前对其进行处理。

该过程将创建大型阵列并消耗大量内存。因此,我想知道下面列出的哪个选项是释放内存的正确方法

选项1:什么也不做,让GC处理内存使用

for(int i=0;i<10;i++) {
    var bigArray = new Array(20000000);
    //do something with bigArray
}

选项2:设置为空

for(int i=0;i<10;i++) {
    var bigArray = new Array(20000000);
    //do something with bigArray

    bigArray=null;  
}

选项3:在释放数组内容后设置为null

for(int i=0;i<10;i++) {
    var bigArray=new Array(20000000);

    //do something with bigArray

    bigArray=[];
    bigArray=null;  
}

选项4:将数组长度设置为零后设置为null

for(int i=0;i<10;i++) {
    var bigArray=new Array(20000000);
    //do something with bigArray
    bigArray.length=0;
    bigArray=null;  
}

3 个答案:

答案 0 :(得分:1)

如果

bigArray的所有引用都丢失,则将完全收集垃圾。使用:

 bigArray = [];

原始引用丢失,并且数组被垃圾回收,bigArray指向一个新的空数组。使用:

bigArray = null;

参考也丢失了。与

bigArray.length = 0;

该数组将失去对其所有存储值的引用,只是该数组本身保留在内存中。

现在您应该做什么(而不是在循环外创建泄漏变量并手动管理其取消引用):

只需正确定义范围,即可自动取消引用:

for(let i = 0; i < 10; i++) {
  let bigArray = new Array(20000000);

   //do something with bigArray
   //...
   // array gets recycled here
}

旁注:

Array(20000000)并不是一个大数组,除非您用实际值填充它。

答案 1 :(得分:1)

嗨,

bigArray = null;

如果您想将该变量重用于其他类型

bigArray = [];

如果您想将其作为数组重用

delete bigArray;

如果您已使用此变量

答案 2 :(得分:1)

将其设置为null或将其设置为空数组,未定义的空字符串或其他选项都将起作用,因为它使数据有资格进行垃圾收集。

通知:

在您的第一个示例中(使用var)不会使其符合垃圾回收的条件,因为您正在存储从全局范围到var的引用:

for(i=0;i<10; i++){
   var pippo = "TEST";
}
console.log(pippo);