有没有人知道为什么内存消耗在这里保持不变?
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);
}
为什么它应该线性增加内存分配的原因是:'检查'方法在其定义中调用自身,因此闭包变量可用于内部检查方法执行,然后再次为测试函数创建执行上下文,依此类推。
此外,在每次执行中,我们都会创建一个Uint16Array的内存块,我相信它是在堆中分配的,并且永远不会被解除分配,因为它可以从闭包中访问。
内存配置文件:
查看内存时间轴,随着时间的增加,它似乎不会增加内存分配。这是预期的行为吗?
答案 0 :(得分:3)
uArr
只是一个局部变量,在check()
退出后分配,使用,然后进行垃圾回收。 check()
内没有关闭。 setTimeout()
调用check()
{但未定义}。
This page on Closures可能会有所帮助。
如果确实有N次调用check()
,则会创建N个闭包(以及node
的N个副本),setTimeout()
将释放其参考在调用它之后到check()
。因此,那里也没有泄漏。