function test() {
var a = [];
return function (){
a.push(1)
return a
}
}
var t = test();
t();
t();
t = null;
这样的话 a 会被释放吗? 如何不会应该怎么释放?
function test() {
var a = [];
return function (){
a.push(1)
return a
}
}
var t = test();
t();
t();
t = null;
这样的话 a 会被释放吗? 如何不会应该怎么释放?
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答5.1k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
这是写 t=null时的图
这是不写 t = null时的图
以上都是在无痕模式下6秒的结果
可以发现无论是否写t = null, 都是没发生内存泄漏的。
多次测试, 偶尔有以下结果

可以发现,有创建堆栈,但是是趋于稳定的,是绝对没发生内存泄漏的。
也许这就是v8的威力吧
以上测试是在遍历1w遍的情况下产生的。
再次根据次数测试
测试
1W
最终被释放, 且最高时占用1.6mb
100w
最终被释放,且最高时占用2.8mb,最终heap为883kb
10000w
最终被释放,且最高时占用还是2.8mb,最终heap为883kb
修改代码测试
将t的引用放入循环会怎样?
可以看到确实比把引用写在外面多占用了很多内存,但最终还是平稳趋于2.0mb,所以并未造成内存飞升,只是t的引用没有释放.
手动将t引用释放!
芜湖~ 起飞 heap又回到了883kb
~