Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
sisterAn opened this issue Mar 10, 2021 · 6 comments
Labels

Comments

@sisterAn
Copy link
Owner

function test() {  
  var a = 1;  
  var b = {};  
  var c = {a: a};  
  return c;
} 

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

@Vgbire
Copy link

Vgbire commented Mar 17, 2021

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

@xixizhangfe
Copy link

  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
Copy link

Vgbire commented Mar 21, 2021

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

@blateyang
Copy link

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

@qq8282661
Copy link

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

d 是挂载到global上面的嘛?

@xixizhangfe
Copy link

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

5 participants