V8中的堆栈和堆(JavaScript)

29 javascript v8

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

Vya*_*rov 34

  • 在V8 null,undefined,truefalse内部是堆分配的对象.如果您是从正在添加Java的,你可以说,truefalse在V8更像是Boolean.TRUEBoolean.FALSEJava编写的.
  • 实际局部变量与闭包捕获或eval/with阴影的变量之间存在重要差异.捕获变量存储在名为Context的特殊堆分配结构中,并间接访问.有关实际与上下文分配变量的更多详细信息,请参阅我对其他问题的回答
  • V8有两个编译器:非优化(又称完整)和优化一个:

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


Mat*_*arz 15

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

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

  • 当一个函数关闭本地时,闭包对象在堆上?执行代码时,框架是否永远不会移动到堆栈? (2认同)