gpt4 book ai didi

Javascript内存泄漏setTimeout问题

转载 作者:行者123 更新时间:2023-11-29 10:43:57 26 4
gpt4 key购买 nike

有谁知道为什么内存消耗在这里保持不变?

var count = 0;
$(init);

function init(){
var node = document.querySelector('.logs');

function check(){
var uArr = new Uint16Array(100);
log(node, uArr.length);
setTimeout(check,100);
}
setTimeout(check,100);
}


function log(node, text){
if( count % 30 == 0 ){
node.innerHTML = '';
}
var child = document.createElement('div');
child.innerText = 'count ' + (count++) + " arr len " + text;
node.appendChild(child);
}

http://jsfiddle.net/V99Eb/11/

它应该线性增加内存分配的原因是:'check' 方法在其定义中调用自身,因此闭包变量将可用于内部 check 方法执行,然后再次为测试函数创建执行上下文,并且很快。

此外,在每次执行中,我们都会创建 Uint16Array 的内存块,我认为它是在堆中分配的,并且永远不会被取消分配,因为它可以从闭包中访问。

内存配置文件: enter image description here

看内存时间轴,似乎并没有随着时间的增加而增加内存分配。这是预期的行为吗?

最佳答案

uArr 只是一个局部变量,在 check() 退出后被分配、使用,然后被垃圾回收。 check() 中没有闭包。 setTimeout()check() 调用(但未定义)。

This page on Closures可能会有帮助。

如果确实有 N 次调用 check(),就会创建 N 个闭包(以及 node 的 N 个副本),setTimeout() 调用后会释放对 check() 的引用。因此,那里也没有泄漏。

关于Javascript内存泄漏setTimeout问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23233013/

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