Área de pila de la máquina virtual de Java (JVM)

Para cada subproceso, JVM crea una pila separada en el momento de la creación del subproceso. No es necesario que la memoria de una pila de Java Virtual Machine sea contigua. La máquina virtual de Java solo realiza dos operaciones directamente en las pilas de Java: inserta y extrae marcos. Y la pila para un subproceso en particular puede denominarse Ejecutar – Pila de tiempo. Cada llamada de método realizada por ese subproceso se almacena en la pila de tiempo de ejecución correspondiente, incluidos parámetros, variables locales, cálculos intermedios y otros datos. Después de completar un método, se elimina la entrada correspondiente de la pila. Después de completar todas las llamadas a métodos, la pila se vacía y la JVM destruye esa pila vacía justo antes de terminar el subproceso. Los datos almacenados en la pila están disponibles para el subproceso correspondiente y no están disponibles para los subprocesos restantes. Por lo tanto, podemos decir que los datos locales son seguros para subprocesos. Cada entrada en la pila se denomina Marco de pila o Registro de activación

Java-Stack

Estructura del marco de pila 
El marco de pila consta básicamente de tres partes: array de variables locales, pila de operandos y datos de marco . Cuando JVM invoca un método Java, primero verifica los datos de la clase para determinar la cantidad de palabras (tamaño de la array de variables locales y la pila de operandos, que se mide en palabras para cada método individual) requeridas por el método en la array de variables locales y pila de operandos. Crea un marco de pila del tamaño adecuado para el método invocado y lo empuja a la pila de Java. 

1. Array de variables locales (LVA): 
 

  • La parte de variables locales del marco de pila está organizada como una array de palabras de base cero.
  • Contiene todos los parámetros y variables locales del método.
  • Cada ranura o entrada en la array es de 4 bytes.
  • Los valores de tipo int, float y reference ocupan 1 entrada o espacio en la array, es decir, 4 bytes.
  • Los valores de double y long ocupan 2 entradas consecutivas en la array, es decir, 8 bytes en total.
  • Los valores de byte, short y char se convertirán al tipo int antes de almacenarse y ocuparán 1 ranura, es decir, 4 bytes.
  • Pero la forma de almacenar valores booleanos varía de JVM a JVM. Pero la mayor parte de la JVM ofrece 1 ranura para valores booleanos en la array de variables locales.
  • Los parámetros se colocan primero en la array de variables locales, en el orden en que se declaran.
  • Por ejemplo: Consideremos un ejemplo de clase que tiene un método bike() , entonces la array de variables locales será como se muestra en el siguiente diagrama:
// Class Declaration
class Example
{
  public void bike(int i, long l, float f, 
               double d, Object o, byte b)
  {
    
  } 
}     

Local Variable Array for bike()

2. Pila de operandos (SO): 
 

  • JVM usa la pila de operandos como espacio de trabajo como un trabajo duro o podemos decir para almacenar el resultado del cálculo intermedio.
  • La pila de operandos está organizada como una array de palabras como una array de variables locales. Pero no se accede a esto mediante el uso de un índice como una array de variables locales, sino que se accede mediante algunas instrucciones que pueden enviar el valor a la pila de operandos y algunas instrucciones que pueden extraer valores de la pila de operandos y algunas instrucciones que pueden realizar las operaciones requeridas.
  • Por ejemplo: así es como una JVM usará este código a continuación que restaría dos variables locales que contienen dos ints y almacenaría el resultado int en una tercera variable local:

Assembly Code Instruction for Operand Stack

  • Así que aquí las dos primeras instrucciones iload_0 e iload_1 empujarán los valores en la pila de operandos desde una array de variables locales. Y la instrucción isub restará estos dos valores y almacenará el resultado nuevamente en la pila de operandos y después de istore_2 , el resultado aparecerá de la pila de operandos y se almacenará en una array de variables locales en la posición 2.

Working of LVA and OS

3. Datos del cuadro (FD): 
 

  • Contiene todas las referencias simbólicas ( resolución de grupo constante) y los retornos de métodos normales relacionados con ese método en particular.
  • También contiene una referencia a la tabla de excepciones que proporciona la información del bloque catch correspondiente en el caso de excepciones.

Publicación traducida automáticamente

Artículo escrito por Anshul_Aggarwal y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *