Marco de pila JVM

 

Se almacenan en el marco de la pila.
  • Tabla de variables locales
  • Pila de operandos (o pila de expresiones)
  • Enlace dinámico (o referencia de método al grupo constante de tiempo de ejecución)
  • Dirección de retorno del método (o definición cuando el método sale normalmente o cuando sale anormalmente)
  • Alguna información adicional

 

Primero, la tabla de variables locales
Es un conjunto de espacio de almacenamiento de valores variables para almacenar parámetros del método y variables locales definidas dentro del método. Cuando el programa Java se compila en un archivo de clase, la capacidad máxima de la tabla de variables locales que el método necesita asignar se determina en el elemento de datos max_locals de la propiedad Code del método.
  • La unidad de almacenamiento más básica de la tabla de variables locales es Slot (ranura variable)
  • La tabla de variables locales almacena varios tipos de datos básicos (8 tipos), tipos de referencia (referencia) y tipos returnAddress conocidos en tiempo de compilación
  • En la tabla de variables locales, los tipos dentro de 32 bits ocupan solo una ranura (incluida returnAddress), y los tipos de 64 bits (largos y dobles) ocupan 2 ranuras
  • byte, short, char se convierten a int antes del almacenamiento, boolean también se convierte a int, 0 significa falso, no cero significa verdadero.
  • La tabla de variables locales también se denomina matriz de variables locales o tabla de variables locales.
  • La capacidad requerida de la tabla de variables locales se determina en el momento de la compilación y se almacena en el elemento de datos de variables locales máximas de la propiedad Código del método. El tamaño de la tabla de variables locales no cambiará durante la ejecución del método.

 

Ejecute el comando: javap -verbose para ejecutar el archivo .class

 

Segundo, la pila de operandos
La pila se puede implementar utilizando matrices o listas vinculadas. La pila de operandos también se denomina pila de expresiones.

  • La pila de operandos se utiliza principalmente para guardar los resultados intermedios del proceso de cálculo y al mismo tiempo como un espacio de almacenamiento temporal para las variables en el proceso de cálculo.
  • La pila de operandos es un área de trabajo del motor de ejecución JVM. Cuando un método comienza la ejecución, se creará un nuevo marco de pila en consecuencia. La pila de operandos de este método está vacía.
  • Cada pila de operandos tendrá una profundidad de pila clara para almacenar valores. La profundidad máxima requerida se define en el momento de la compilación y se almacena en la propiedad Código del método como el valor de max_stack.
  • Cualquier elemento en la pila puede ser cualquier tipo de datos Java.
El tipo de 32 bits ocupa una profundidad de unidad de pila
El tipo de 64 bits ocupa una profundidad de unidad de pila
  • La pila de operandos no utiliza el método de acceso al índice para el acceso a datos, pero solo puede completar un acceso a datos a través de operaciones estándar de inserción y extracción.
 
Durante la ejecución del método, de acuerdo con las instrucciones del código de bytes, escriba datos en la pila o extraiga datos, es decir, activar / desactivar la pila
Algunas instrucciones de código de bytes introducen el valor en la pila de operandos, y las instrucciones de código de bytes restantes extraen el operando de la pila. Después de usarlos, empuja el resultado a la pila.

 

Ejemplos

public  void testAddOperation () {
     byte i = 15 ;
     int j = 8 ;
     int k = i + j; 
} 
// código correspondiente, es decir, instrucción de código de byte 
 0 bipush 15 
 2 istore_1
  3 bipush 8 
 5 istore_2
  6 iload_1
  7 iload_2
  8 iadd
  9 istore_3
 10 return

Pasos de implementación

 

 

Tres, enlace dinámico
La vinculación dinámica también se conoce como una referencia de método al grupo constante de tiempo de ejecución
Cada marco de pila contiene una referencia al método al que pertenece el marco de pila en el grupo constante de tiempo de ejecución. El propósito de incluir esta referencia es admitir el código del método actual para lograr la vinculación dinámica (Dynamic Linking), como por ejemplo: instrucción dinámica invocada.
Cuando el archivo fuente de Java se compila en un archivo de código de bytes, todas las referencias de variables y métodos se almacenan como referencias de símbolos (referencia simbólica) en el grupo constante del archivo de clase. Por ejemplo: cuando se describe un método que llama a otro método, se representa mediante una referencia de símbolo que apunta al método en el grupo constante, luego el papel de la vinculación dinámica es convertir estas referencias de símbolo en referencias directas al método de llamada.
 

 

Cuatro, dirección de retorno del método
  • Almacene el valor del registro de PC llamando a este método
  • Hay dos formas de finalizar un método: se completa la ejecución normal; se produce una excepción no controlada y una salida anormal.
  • No importa en qué forma salir, una vez que el método sale, vuelve a la posición donde se llama el método. Cuando el método sale normalmente, el valor del contador de PC de la persona que llama se usa como la dirección de retorno, es decir, la dirección de la siguiente instrucción de la instrucción que llamó al método. Al salir por excepción, la dirección de retorno está determinada por la tabla de excepciones, y esta parte de la información generalmente no se guarda en el marco de la pila.
 
En esencia, la salida del método es el proceso de reventar el marco de la pila actual. En este punto, debe restaurar la tabla de variables locales del método de nivel superior, la pila de operandos, insertar el valor de retorno en la pila de operandos del marco de la pila de llamantes, establecer el valor de registro de la PC, etc., para que el método de la llamada continúe ejecutándose.
La diferencia entre la salida de finalización normal y la salida de finalización anormal es que la salida a través de la salida de finalización anormal no generará ningún valor de retorno a su llamador superior.
 
Cuando un método comienza a ejecutarse, solo hay dos formas de salir del método:
1. Cuando el motor de ejecución encuentra una instrucción de bytecode (retorno) devuelta por cualquier método, el valor de retorno se pasará al llamador de método superior, denominado salida de finalización normal;
    La instrucción de retorno que un método necesita usar después de completar la llamada normal también depende del tipo de datos real del valor de retorno del método.
    En la instrucción bytecode, la instrucción de retorno incluye ireturn (cuando el valor de retorno es booleano, byte, char, short e int), lretrun, freturn, dreturn y areturn, y hay una instrucción de retorno para el método y la instancia declarada como nula Se utilizan métodos de inicialización, métodos de inicialización de clase e interfaz.
2. Se encontró una excepción durante la ejecución del método, y esta excepción no se manejó dentro del método, es decir, mientras no se encontrara un controlador de excepción coincidente en la tabla de excepciones de este método, se saldría del método. Abreviado como finalización anormal de la exportación.

 

Supongo que te gusta

Origin www.cnblogs.com/caoxb/p/12735566.html
Recomendado
Clasificación