【发布时间】:2015-07-29 11:08:40
【问题描述】:
在对这个问题的第一条评论之后: What makes this function run much slower?
垃圾收集器会清理堆栈内存吗?根据我的阅读,通常 gc 不会这样做。
按照这个问题,我想堆栈和堆内存之间没有物理区别;有虚拟部门吗?我的意思是:当理论上使用所有堆栈内存而不会导致溢出并且之后将新内存分配给对象时会发生什么?
有人可以详细说明这实际上是如何工作的吗? 谢谢。
【问题讨论】:
-
栈和堆只是在分配和释放方式上不同。然而,对象几乎总是从堆中分配,并且对象的引用将存储在堆栈变量(函数局部变量)中。函数返回时,函数使用的堆栈被释放,堆对象的引用计数减少。然后,GC 负责从堆中释放对象。
-
我知道一个引用存储在堆栈中,但最终我想一切(包括对象本身)都存储在物理内存中。我想知道 js 引擎是如何完成栈/堆内存的划分的。正如您还提到的,我没有看到明确的迹象表明堆栈内存会被 gc 释放。
-
栈内存由JS引擎处理;如何实现完全取决于 JS 实现。
-
堆栈由
call、ret、push和pop等CPU指令处理,处理堆栈寄存器esp(intel上)。非常低级。它是由操作系统设置的用于处理函数调用的 RAM 区域。call将push下一条指令在堆栈上的偏移量,然后将jmp到被调用函数。该函数以ret结束,pops 是返回地址,jmps 在那里。另一方面,堆是由操作系统设置的内存区域,通常在程序映像之后,可以通过内核调用调整大小。它由malloc和free库函数管理。 -
感谢 Dave 和 Kenney,澄清了这一点。不过,我也会接受它作为答案。
标签: javascript garbage-collection