2011-07-06 7 views
20

¿utiliza V8 stack y heap como JVM? si es así, ¿pone primitivas en la pila y objetos en el montón?pila y montón en V8 (JavaScript)

+1

No he hecho una respuesta completa ya que no leí completamente el artículo, pero definitivamente hubo discusiones sobre el uso de pila/pila/registro en http://wingolog.org/archives/2011/07/05/v8- a-tale-of-two-compilers – Domenic

+0

ver http://stackoverflow.com/questions/16949690/many-erros-when-i-try-compile-c-in-v8-javascript/19088160#19088160 – wcy

Respuesta

12

Sí, V8 utiliza un montón similar a JVM y la mayoría de los demás lenguajes. Esto, sin embargo, significa que las variables locales (como regla general) se ponen en la pila y los objetos en el montón. Esto puede, por ejemplo, no mantenerse si una función cierra sobre estos valores. Al igual que en la JVM, las primitivas solo se pueden almacenar en la pila si están almacenadas en una variable local.

Como usuario, no es algo de lo que normalmente deba preocuparse.

+0

Mucho los detalles del comportamiento en tiempo de ejecución pueden variar en función de las optimizaciones aplicadas. Cf. http://code.google.com/apis/v8/design.html –

+0

En realidad, hasta donde yo sé, el problema de la pila frente al montón es bastante estático en el V8, pero no estoy 100% seguro de ello. Las cosas con las que enlazas son sobre el acceso a propiedades en objetos que tiene poco que ver con esto. –

+2

cuando una función cierra sobre locales el objeto de cierre está en el montón?¿El marco nunca se mueve a la pila cuando se ejecuta su código? –

28
  • En V8 null, undefined, true y false internamente son heap allocated objects. Si proviene de Java, puede decir que true y false en V8 son más como Boolean.TRUE y Boolean.FALSE en Java.
  • Existe una diferencia importante entre real variables locales y variables que son capturadas por cierres o sombreadas por eval/with. Las variables de captura se almacenan en una estructura asignada de montón especial llamada Context y se accede indirectamente. Para más detalles sobre contexto real vs asigna variables de ver my answer to a different question
  • V8 tiene dos compiladores: no optimizando (aka completo) y optimizando uno:

    • no la optimización de compilador no puede almacenar en coma flotante números y enteros más allá de 31 bits (32 bits en x64) en la pila, siempre los coloca en HeapNumber s. No intenta registrar la asignación y almacena variables locales en la pila.
    • La optimización del compilador es mucho más inteligente. Registra la asignación (exploración lineal) y puede mantener enteros completos de 32 bits y números de coma flotante en la pila y en los registros (incluidos los registros XMM).
  • Hablando de JVM: Se puede realizar la llamada asignación de pila y asignar un objeto no se escape en la pila en lugar del montón. Una optimización más genérica (escalar reemplazo) a veces puede eliminar por completo la asignación de objetos que no escapan y explotar en campos separados.

+0

¿Podría actualizar su primer enlace? – Randomblue

+0

@Randomblue ¡Disculpe las molestias! Actualicé enlaces para usar números de revisión fijos para evitar ese problema en el futuro. –

0

En los términos más generales, Sí V8 utiliza un montón y pila para que funcione en el que las variables locales generales se almacenan en la pila mientras que los objetos que necesitan ser mantenidos se almacenan en el montón.

Cuestiones relacionadas