我正在使用画布进行图像处理。
用户每次将选择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;
}
答案 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);