【问题标题】:Does the JS garbage collector clear stack memory?JS 垃圾收集器是否清除堆栈内存?
【发布时间】:2015-07-29 11:08:40
【问题描述】:

在对这个问题的第一条评论之后: What makes this function run much slower?

垃圾收集器会清理堆栈内存吗?根据我的阅读,通常 gc 不会这样做。
按照这个问题,我想堆栈和堆内存之间没有物理区别;有虚拟部门吗?我的意思是:当理论上使用所有堆栈内存而不会导致溢出并且之后将新内存分配给对象时会发生什么?

有人可以详细说明这实际上是如何工作的吗? 谢谢。

【问题讨论】:

  • 栈和堆只是在分配和释放方式上不同。然而,对象几乎总是从堆中分配,并且对象的引用将存储在堆栈变量(函数局部变量)中。函数返回时,函数使用的堆栈被释放,堆对象的引用计数减少。然后,GC 负责从堆中释放对象。
  • 我知道一个引用存储在堆栈中,但最终我想一切(包括对象本身)都存储在物理内存中。我想知道 js 引擎是如何完成栈/堆内存的划分的。正如您还提到的,我没有看到明确的迹象表明堆栈内存会被 gc 释放。
  • 栈内存由JS引擎处理;如何实现完全取决于 JS 实现。
  • 堆栈由callretpushpop等CPU指令处理,处理堆栈寄存器esp(intel上)。非常低级。它是由操作系统设置的用于处理函数调用的 RAM 区域。 callpush 下一条指令在堆栈上的偏移量,然后将 jmp 到被调用函数。该函数以ret 结束,pops 是返回地址,jmps 在那里。另一方面,堆是由操作系统设置的内存区域,通常在程序映像之后,可以通过内核调用调整大小。它由mallocfree 库函数管理。
  • 感谢 Dave 和 Kenney,澄清了这一点。不过,我也会接受它作为答案。

标签: javascript garbage-collection


【解决方案1】:

垃圾收集器会清理堆栈内存吗?

没有。 garbage collector 只管理堆内存。当程序返回到该堆栈帧时,预计将再次需要堆栈上的所有值,因此不得收集它们。从堆栈到堆的引用确实被认为是活动的。

stack memory 会在函数退出时自动清除。

当然,程序的哪些部分进入堆栈,哪些进入堆,在 JavaScript 这样的动态语言中并不容易决定。一些优化允许在堆栈上分配对象,而闭包可能需要在堆中分配变量环境。

我想堆栈和堆内存之间没有物理上的区别;有虚拟部门吗?

确实如此。 “堆栈”只是计算机内存的一个(通常是固定大小)区域,专用于某些进程的“堆栈”。事实上,你的记忆中有很多堆栈,每个线程一个,解释器(例如 JS)也创建自己的堆栈。

【讨论】:

    猜你喜欢
    • 2013-12-30
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2012-06-12
    • 2014-03-27
    相关资源
    最近更新 更多