V8中的堆栈和堆(JavaScript)
V8是否像JVM一样使用堆栈和堆?V8中的堆栈和堆(JavaScript),javascript,v8,Javascript,V8,V8是否像JVM一样使用堆栈和堆? 如果是这样,它会将原语放在堆栈上,将对象放在堆上吗?是的,V8使用的堆类似于JVM和大多数其他语言。然而,这意味着局部变量(作为一般规则)被放在堆栈和堆中的对象上。例如,如果函数关闭超过这些值,这可能不成立。 与在JVM中一样,如果原语存储在局部变量中,则它们只能存储在堆栈上 作为一个用户,这不是你通常需要担心的事情。 在V8null中,未定义,true和false内部为空。如果您来自Java,那么可以说V8中的true和false更像Java中的Boolea
如果是这样,它会将原语放在堆栈上,将对象放在堆上吗?是的,V8使用的堆类似于JVM和大多数其他语言。然而,这意味着局部变量(作为一般规则)被放在堆栈和堆中的对象上。例如,如果函数关闭超过这些值,这可能不成立。 与在JVM中一样,如果原语存储在局部变量中,则它们只能存储在堆栈上 作为一个用户,这不是你通常需要担心的事情。
- 在V8
中,null
,未定义
和true
内部为空。如果您来自Java,那么可以说V8中的false
和true
更像Java中的false
和Boolean.true
Boolean.false
- 实局部变量和闭包捕获的变量或eval/with隐藏的变量之间有一个重要区别。捕获变量存储在一个称为的特殊堆分配结构中,并被间接访问。有关真实与上下文分配变量的更多详细信息,请参阅
- V8有两个编译器:非优化编译器(也称为完全编译器)和优化编译器:
- 非优化编译器不能在堆栈上存储超过31位(x64上为32位)的浮点数和整数,它总是将它们装箱到s中。它不尝试进行寄存器分配,而是在堆栈上存储真正的局部变量
- 优化编译器要聪明得多。它进行寄存器分配(线性扫描),可以在堆栈和寄存器(包括XMM寄存器)中保留完整的32位整数和浮点数
- 说到JVM:它可以执行所谓的堆栈分配,并在堆栈而不是堆上分配一个非转义对象。更一般的优化(标量替换)有时可以完全消除非转义对象的分配,并将其分解为单独的字段