以下是非常大的逻辑的一部分,功能跟踪仅用于简化。跟踪从数据库加载对象并存储在缓存中。
var cache = [];
function newObject(a){
var b = {};
b.tracker = a;
cache.push(b);
}
var t = {};
track(t);
track(t);
track(t);
track(t);
...
cache.length = 0;
track(t);
track(t);
track(t);
track(t);
....
cache.length = 0;
清除缓存后,是否会导致内存泄漏,因为b.tracker持有对t的引用?为了澄清,跟踪器t不存储对任何创建的对象的任何引用。
我需要以下方法吗?
for(var i=0;i<cache.length;i++){
cache[i].tracker = null;
}
cache.length = 0;
或者JavaScript引擎足够聪明,可以删除b的所有实例,因为没有正文引用b了吗?
答案 0 :(得分:3)
当变量超出范围时,会收集垃圾。现在要删除cache
,您将有三种方法:
delete cache; // which is not possible because it's defined with var.
cache = [];
cache.length = 0;
对于最后一个,cache.length = 0;
我注意到效果是理想的效果。它会生成n delete operations
类型的delete cache[i]
。一旦delete
操作发生,cache[i]
中保存的值就会被取消引用,超出范围,垃圾收集器就会启动。
所以是的,JavaScript引擎非常聪明,可以做到这一点。我测试了4套分析工具(Chrome,Safari,Firefox和Opera)。我缺乏拥有Windows机器所需的极大耐心,所以我无法在Internet Explorer中进行测试。
<强>更新强>
根据@Renan的说法,上述内容在Internet Explorer中同样适用,因此cache.length = 0
绝对是可行的方法。
答案 1 :(得分:2)
Javascript应该回收你的t占用的内存,如果这就是你正在做的事情。如果要将数组的长度设置为零,则不必将数组项设置为null。