【发布时间】:2014-06-07 14:52:54
【问题描述】:
有人知道为什么这里的内存消耗保持不变吗?
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);
}
它应该线性增加内存分配的原因是:'check' 方法在其定义中调用自身,因此闭包变量将可用于内部检查方法执行,然后再次为测试函数创建一个执行上下文,并且很快。
此外,在每次执行中,我们都会创建一个 Uint16Array 的内存块,我认为它是在堆中分配的,并且永远不应该被解除分配,因为它可以从闭包中访问。
内存配置文件:
查看内存时间线,似乎并没有随着时间的增加而增加内存分配。这是预期的行为吗?
【问题讨论】:
-
为什么您的标题声称存在内存泄漏问题,而实际上您证明没有内存泄漏?
-
uArr只是一个局部变量,它的生命周期只是check()的当前执行。一旦对check()的一次调用完成,该调用的局部变量就有资格进行垃圾回收,因为不再有任何代码可以访问它们。唯一在闭包中无限期存在的变量是node。
标签: javascript performance memory-management memory-leaks javascript-debugger