V8中的堆栈和堆(JavaScript)

时间:2011-07-06 20:57:02

标签: javascript v8

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

3 个答案:

答案 0 :(得分:31)

  • 在V8 null中,undefinedtruefalse内部为heap allocated objects。如果您使用Java,可以说V8中的truefalse更像是Java中的Boolean.TRUEBoolean.FALSE
  • 真实的局部变量与闭包捕获或eval / with阴影的变量之间存在重要差异。捕获变量存储在名为Context的特殊堆分配结构中,并间接访问。有关真实与上下文分配变量的更多详细信息,请参阅my answer to a different question
  • V8有两个编译器:非优化(又称完整)和优化一个:

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

答案 1 :(得分:15)

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

作为用户,您通常不需要担心。

答案 2 :(得分:0)

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