在对此问题的第一条评论之后: What makes this function run much slower?
垃圾收集器是否扫描堆栈内存?从我读过的,通常gc不会这样做。
在这个问题之后,我想象堆栈和堆内存之间没有物理差异;有虚拟分裂吗?我的意思是:当理论上使用所有堆栈内存而不会导致溢出并且之后将新内存分配给对象时会发生什么?
有人可以详细说明这实际上是如何运作的吗? 谢谢。
答案 0 :(得分:4)
垃圾收集器是否扫描堆栈内存?
没有。 garbage collector仅管理堆内存。当程序返回到该堆栈帧时,预计将再次需要堆栈上的所有值,因此不得收集它们。从堆栈到堆的引用确实被认为是活着的。
当函数退出时,stack memory会自动清除。
当然,程序的哪些部分进入堆栈并进入堆中并不容易用像JavaScript这样的动态语言来决定。一些优化允许在堆栈上分配对象,而闭包可能需要在堆中分配变量环境。
我认为堆栈和堆内存之间没有物理差异;有虚拟分裂吗?
这是真的。 “堆栈”只是计算机内存的一个(通常是固定大小的)区域,专用于某个进程的“堆栈”。确实有很多堆栈存在于你的内存中,每个线程一个,而解释器(例如JS)也创建自己的堆栈。