【问题标题】:stack and heap in V8 ( JavaScript)V8 中的堆栈和堆(JavaScript)
【发布时间】:2011-09-29 23:30:14
【问题描述】:

V8 是否像 JVM 一样使用堆栈和堆? 如果是这样,它会将原语放在堆栈上,将对象放在堆上吗?

【问题讨论】:

标签: javascript v8


【解决方案1】:
  • 在 V8 中 nullundefinedtruefalse 内部是 heap allocated objects。如果您来自 Java,您可以说 V8 中的 truefalse 更像 Java 中的 Boolean.TRUEBoolean.FALSE
  • real 局部变量与由闭包捕获或由 eval/with 遮蔽的变量之间存在重要区别。捕获变量存储在称为Context 的特殊堆分配结构中,并且可以间接访问。有关 real 与上下文分配变量的更多详细信息,请参阅my answer to a different question
  • V8 有两种编译器:非优化(又名完整)和优化一种:

    • 非优化编译器无法在堆栈上存储超过 31 位(x64 上为 32 位)的浮点数和整数,它总是将它们装箱到 HeapNumbers 中。它不会尝试进行寄存器分配,而是在堆栈上存储 real 局部变量。
    • 优化编译器要聪明得多。它进行寄存器分配(线性扫描),并且可以在堆栈和寄存器(包括 XMM 寄存器)中保留完整的 32 位整数和浮点数。
  • 说到JVM:它可以执行所谓的堆栈分配,并在堆栈而不是堆上分配一个非转义对象。更通用的优化(标量替换)有时可以完全消除非转义对象的分配并将其分解为单独的字段。

【讨论】:

  • @Randomblue 很抱歉给您带来不便!我更新了链接以使用固定的修订号以避免将来出现此类问题。
【解决方案2】:

是的,V8 使用类似于 JVM 和大多数其他语言的堆。然而,这意味着局部变量(作为一般规则)被放在堆栈中,而对象则放在堆中。例如,如果函数关闭这些值,这可能不成立。 与在 JVM 中一样,原语只能存储在堆栈中,前提是它们存储在局部变量中。

作为用户,这不是您通常需要担心的事情。

【讨论】:

  • 运行时行为的许多细节可能会因应用的优化而异。参照。 code.google.com/apis/v8/design.html
  • 事实上,据我所知,堆栈与堆的问题在 V8 中是相当静态的,但我对此不是 100% 确定的。您链接到的内容是关于对象中的属性访问,与此无关。
  • 当一个函数在局部变量上关闭时,闭包对象在堆上?框架在执行代码时是否永远不会移动到堆栈中?
  • 是的,我不明白闭包如何与堆栈一起工作。闭包基本上就像内存中的对象,我看不出局部变量如何在闭包中的堆栈上......
  • 一个对象可以是一个局部变量(你的回答暗示对象不能是局部的),然后会发生什么?我假设它们仍然存储在堆中。
【解决方案3】:

一般来说,Yes V8 使用堆和堆栈来运行,其中一般局部变量存储在堆栈中,而需要维护的对象存储在堆中。

【讨论】:

    猜你喜欢
    • 2010-10-14
    • 2014-06-23
    • 2020-10-24
    • 2014-08-05
    • 1970-01-01
    • 2012-10-29
    • 2016-04-20
    • 1970-01-01
    • 2013-09-25
    相关资源
    最近更新 更多