sisterAn / JavaScript-Algorithms

基础理论+JS框架应用+实践,从0到1构建整个前端算法体系
5.45k stars 626 forks source link

执行test后,说一说,堆栈发生了啥变化,最后c的内存会被回收吗? #157

Open sisterAn opened 3 years ago

sisterAn commented 3 years ago
function test() {  
  var a = 1;  
  var b = {};  
  var c = {a: a};  
  return c;
} 

执行test后,说一说,堆栈发生了啥变化,最后c的内存会被回收吗?

Vgbire commented 3 years ago

答案是什么?可以告知一下吗?如果方法的执行结果被一个变量接收,C就不会被回收,如果直接执行就会回收?

xixizhangfe commented 3 years ago
  1. test函数入栈
  2. 栈内存中创建a,对应的值为1
  3. 堆内存中开辟一块内存放b指向的那个对象,假设内存地址是0x0000;栈内存中创建b,值为0x0000
  4. 堆内存中开辟一块内存放c指向的那个对象,假设内存地址是0x1111;栈内存中创建c,值为0x1111
  5. test函数执行结束,a=1; b=0x0000; c=0x1111出栈,test函数出栈
  6. 此时c指向的那块内存不再被用到,则被当做垃圾回收。

如果执行方式不是test(), 而是 var d = test() ,c也一样会被回收。

Vgbire commented 3 years ago

很强,明白了,c会回收,但是如果var d= test()的话0x1111这个对象实不会被回收的,因为被d引用了

blateyang commented 3 years ago

利用process.memoryUsage通过实验发现即使将test()的执行结果赋值给变量d,分配给c的内存还是会被回收,不明白为什么? @xixizhangfe

qq8282661 commented 3 years ago

利用process.memoryUsage通过实验发现即使将test()的执行结果赋值给变量d,分配给c的内存还是会被回收,不明白为什么? @xixizhangfe

d 是挂载到global上面的嘛?

xixizhangfe commented 3 years ago

利用process.memoryUsage通过实验发现即使将test()的执行结果赋值给变量d,分配给c的内存还是会被回收,不明白为什么? @xixizhangfe

当赋值给d这一行代码也执行过后,整个程序就结束了,内存自然要被回收。不回收的话不就造成内存泄露了么?