Conocimiento profundo del motor de ejecución de código de bytes de la máquina virtual Java Segunda Edición (ocho)

 

1. Descripción general

En diferentes implementaciones de máquinas virtuales, cuando el motor de ejecución ejecuta código Java, puede haber dos opciones: ejecución interpretada (ejecutada por el intérprete) y ejecución compilada (generada por el compilador instantáneo para generar código local).

 

2. Estructura del marco de la pila en tiempo de ejecución

Un marco de pila (Stack Frame) es una estructura de datos utilizada para soportar la invocación de métodos y la ejecución de métodos de una máquina virtual. Es un elemento de pila de una pila de máquina virtual (Pila de máquina virtual) en un área de datos de una máquina virtual en tiempo de ejecución.

El marco de la pila incluye la tabla de variables locales, la pila de operandos, el enlace dinámico, la dirección de retorno del método y alguna información adicional adicional.

 

 

 3. Llamada de método

La única tarea en la fase de invocación del método es determinar la versión del método llamado (es decir, qué método llamar).

El método de destino en todas las llamadas a métodos es una referencia de símbolos en un grupo constante en el archivo de clase. Durante la etapa de resolución de la carga de clases, algunas de las referencias de símbolos se convertirán en referencias directas

El método tiene una versión de llamada definida antes de que el programa realmente se ejecute, y la versión de llamada de este método no se puede cambiar durante el tiempo de ejecución.

3.1 Análisis

El objetivo de la llamada debe determinarse cuando se escribe el código del programa y se compila el compilador. Este tipo de llamada al método se llama Resolución

La llamada de resolución debe ser un proceso estático. Se determina completamente durante la compilación. Durante la fase de resolución de la carga de clases, todos los símbolos referenciados se convertirán en referencias directas determinables y no se retrasarán hasta que se complete el tiempo de ejecución.

La máquina virtual Java proporciona cinco métodos para llamar a instrucciones de bytecode:

  • invokestatic: llama a un método estático.
  • invokespecial: invoca el método <init> del constructor de instancias, el método privado y el método de la clase principal.
  • invokevirtual: llama a todos los métodos virtuales.
  • invokeinterface: llame al método de interfaz y luego determine un objeto que implemente esta interfaz en tiempo de ejecución.
  • invocador dinámico: primero analiza dinámicamente el método al que hace referencia el calificador del punto de llamada en tiempo de ejecución y luego ejecuta el método,

3.2 Despacho

Las llamadas de despacho pueden ser estáticas o dinámicas.

  • Despacho estático
  • Despacho dinámico

Según el número de bases de distribución, se puede dividir en distribución única y distribución múltiple

  • Despacho único
  • Despacho múltiple

 

4. Motor de ejecución de interpretación de código de bytes basado en pila

4.1 El proceso de compilación

 

 

En el lenguaje Java, el compilador Javac completa el proceso de análisis léxico y análisis gramatical del código del programa a un árbol de sintaxis abstracto, y luego atraviesa el árbol de sintaxis para generar un flujo de instrucciones de código de bytes lineal.

4.2 Conjunto de instrucciones basado en pila y conjunto de instrucciones basado en registros

  • Conjunto de instrucciones basadas en la pila: la mayoría de las instrucciones en la secuencia de instrucciones son instrucciones de dirección cero y se basan en la pila de operandos para funcionar
  • Conjunto de instrucciones basado en registros: el más típico es el conjunto de instrucciones de dos direcciones x86, que es más contundente, es la arquitectura del conjunto de instrucciones directamente compatible con nuestras PC convencionales ahora, estas instrucciones se basan en registros para funcionar.

 

4.3 Proceso de ejecución del intérprete basado en pila

El proceso de operación general del conjunto de instrucciones de estructura de pila, las variables intermedias de todo el proceso de operación son el intercambio de pila y la inserción de la pila de operandos como la ruta de intercambio de información.

 

PD: Esta sección es un poco tediosa. Solo entiendo los conceptos generales. Continuaré mirándolos más tarde cuando tenga tiempo. 

 

Descargo de responsabilidad: este artículo es una nota de estudio personal, el contenido proviene de "Conocimiento profundo de la máquina virtual Java · Características avanzadas y mejores prácticas de JVM" Zhou Zhiming y artículos de red

Supongo que te gusta

Origin www.cnblogs.com/xyzshm/p/12677450.html
Recomendado
Clasificación