gpt4 book ai didi

javascript - 以下代码会导致 JavaScript 内存泄漏吗?

转载 作者:行者123 更新时间:2023-11-28 13:43:09 25 4
gpt4 key购买 nike

以下是非常大的逻辑的一部分,函数跟踪只是为了简化。 Track从数据库加载对象并存储在缓存中。

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的引用而导致内存泄漏?需要澄清的是,tracker t 不存储对创建的任何对象的任何引用。

我需要以下方法吗?

for(var i=0;i<cache.length;i++){
cache[i].tracker = null;
}
cache.length = 0;

或者 JavaScript 引擎足够聪明,可以删除 b 的所有实例,因为没有主体再引用 b 了?

最佳答案

当变量超出范围时,它会被垃圾收集。现在要删除该缓存,您可以使用三种方法:

delete cache; // which is not possible because it's defined with var.
cache = [];
cache.length = 0;

对于最后一个,cache.length = 0;我注意到效果是预期的。它会产生 delete cache[i] 类型的 n 个删除操作。一旦发生delete操作,cache[i]中保存的值就会被取消引用,超出范围,垃圾收集器就会启动。

所以,是的,JavaScript 引擎足够聪明,可以做到这一点。我使用 4 套分析工具(Chrome、Safari、Firefox 和 Opera)进行了测试。我缺乏拥有 Windows 计算机所需的极大耐心,因此无法在 Internet Explorer 中进行测试。

更新

根据 @Renan 的说法,上述方法在 Internet Explorer 中也同样有效,因此 cache.length = 0 绝对是最佳选择。

关于javascript - 以下代码会导致 JavaScript 内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16398674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com