V8中的堆栈和堆(JavaScript)

V8中的堆栈和堆(JavaScript),javascript,v8,Javascript,V8,V8是否像JVM一样使用堆栈和堆? 如果是这样,它会将原语放在堆栈上,将对象放在堆上吗?是的,V8使用的堆类似于JVM和大多数其他语言。然而,这意味着局部变量(作为一般规则)被放在堆栈和堆中的对象上。例如,如果函数关闭超过这些值,这可能不成立。 与在JVM中一样,如果原语存储在局部变量中,则它们只能存储在堆栈上 作为一个用户,这不是你通常需要担心的事情。 在V8null中,未定义,true和false内部为空。如果您来自Java,那么可以说V8中的true和false更像Java中的Boolea

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

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

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

  • 在V8
    null
    中,
    未定义
    true
    false
    内部为空。如果您来自Java,那么可以说V8中的
    true
    false
    更像Java中的
    Boolean.true
    Boolean.false
  • 实局部变量和闭包捕获的变量或eval/with隐藏的变量之间有一个重要区别。捕获变量存储在一个称为的特殊堆分配结构中,并被间接访问。有关真实与上下文分配变量的更多详细信息,请参阅
  • V8有两个编译器:非优化编译器(也称为完全编译器)和优化编译器:

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


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

运行时行为的许多细节可能因应用的优化而异。实际上,据我所知,在V8中堆栈与堆的问题是相当静态的,但我不是100%确定。您链接到的内容是关于对象中的属性访问,这与此无关。当函数在局部变量上关闭时,关闭对象在堆上?当框架的代码被执行时,它是否从未移动到堆栈中?是的,我不明白闭包是如何与堆栈一起工作的。闭包基本上类似于内存中的对象,我不知道局部变量如何出现在闭包中的堆栈上……对象可以是局部变量(你的答案意味着对象不能是局部的),然后会发生什么?我假设它们仍然存储在堆中。由于我没有完全阅读这篇文章,所以没有给出完整的答案,但是在see@Randomblue中肯定有关于堆栈/堆/寄存器用法的讨论。对于给您带来的不便,我深表歉意!我更新了链接以使用固定的修订号,以避免将来出现这样的问题。