La ruta de crecimiento del arquitecto java: el área de datos en tiempo de ejecución de la arquitectura general de la máquina virtual JAVA

Ruta de crecimiento del arquitecto Java de Luban College

Área de memoria JVM
Inserte la descripción de la imagen aquí

1. Contador de programas:

La máquina virtual Java puede admitir la ejecución simultánea de varios subprocesos, y cada subproceso de la máquina virtual Java tiene su propio registro de PC (contador de programa). En cualquier momento, un subproceso de máquina virtual Java solo puede ejecutar el código de un método, y el método que está ejecutando el subproceso se denomina método actual del subproceso. Si este método no es nativo, el registro de la PC almacena la dirección de la instrucción de código de bytes que está siendo ejecutada por la máquina virtual Java. Si el método es nativo, entonces el valor del registro de la PC no está definido. La capacidad del registro de la PC debería al menos poder almacenar un tipo de datos returnAddress o un valor de puntero local relacionado con la plataforma.

Esta área es la única área de memoria en el área de datos de tiempo de ejecución de JVM donde no se producirán excepciones OOM.

2. Pila de máquinas virtuales:

Cada subproceso tiene su propia pila de máquina virtual, que se crea al mismo tiempo que el subproceso y se utiliza principalmente para almacenar marcos de pila. El inicio de una llamada al método hasta el final de la ejecución corresponde al apilamiento y estallido del marco de pila. La especificación de la máquina virtual permite que la pila de la máquina virtual se establezca en un tamaño fijo o se expanda y contraiga dinámicamente según los cálculos. Si se adopta un diseño de pila de máquina virtual Java de tamaño fijo, la capacidad de pila de la máquina virtual Java de cada subproceso debe seleccionarse de forma independiente cuando se crea el subproceso. La implementación de la máquina virtual Java debe proporcionar a los programadores o usuarios finales un medio para ajustar la capacidad inicial de la pila de la máquina virtual. Para la pila de la máquina virtual Java que puede expandirse y contraerse dinámicamente, debe proporcionar un medio para ajustar su capacidad máxima y mínima.

2.1. Excepciones que pueden ocurrir:

Si la capacidad de la pila asignada por la solicitud de subproceso excede la capacidad máxima permitida por la pila de la máquina virtual Java, la máquina virtual Java lanzará una excepción StackOverflowError.

Si la pila de la máquina virtual Java se puede expandir dinámicamente y se ha intentado la acción de expansión, pero no se puede solicitar suficiente memoria para completar la expansión, o no hay suficiente memoria para crear la pila de la máquina virtual correspondiente al crear un nuevo subproceso, entonces Java La máquina virtual lanzará una excepción OutOfMemoryError.

2.2, marco de pila

La llamada y el retorno de un método en un subproceso corresponden al push y pop de un marco de pila, es decir, un método corresponde a un marco de pila. El marco de pila incluye principalmente tabla de variables locales, pila de operandos, conexión dinámica y salida de finalización. La capacidad de la tabla de variables locales y la pila de operandos se determina en el momento de la compilación, y se guarda y se proporciona al marco de la pila mediante el atributo Code del método (instrucciones en el código de bytes de la clase). Por lo tanto, el tamaño de la capacidad del marco de pila solo depende de la implementación de la máquina virtual Java y de la memoria que se puede asignar cuando se llama al método.

2.2.1, tabla de variables locales

Una variable local puede almacenar datos de tipo booleano, byte, char, short, float, reference y returnAddress, y dos variables locales pueden almacenar datos de tipo long y double. Las variables locales utilizan índices para el acceso al posicionamiento. El valor del índice de la primera variable local es cero, y el valor del índice de la variable local son todos enteros desde cero hasta menos que la capacidad máxima de la tabla de variables locales.

La máquina virtual Java utiliza la tabla de variables locales para completar la transferencia de parámetros cuando se llama al método (es decir, los parámetros se colocarán en la tabla de variables locales del marco de pila). Cuando se llama a un método, sus parámetros se transferirán al continuo comenzando desde 0 La ubicación de la tabla de variables locales. En particular, cuando se llama a un método de instancia, la 0ª variable local debe usarse para almacenar una referencia al objeto donde se encuentra el método de instancia llamado (es decir, la palabra clave "this" en el lenguaje Java). Otros parámetros posteriores se pasarán a la posición de la tabla de variables locales continuas a partir de 1.

2.2.2, pila de operandos

Cuando se acaba de crear el marco de pila al que pertenece la pila de operandos, la pila de operandos está vacía. La máquina virtual Java proporciona algunas instrucciones de código de bytes para copiar constantes o valores de variable de los campos de la tabla de variable local o instancia de objeto a la pila de operandos. También proporciona algunas instrucciones para obtener datos de la pila de operandos, manipular datos y El resultado de la operación se vuelve a apilar. Cuando se llama al método, la pila de operandos también se usa para preparar los parámetros del método de llamada y el resultado de retorno del método de recepción.

2.2.3, conexión dinámica

Cada marco de pila contiene una referencia al grupo de constantes de tiempo de ejecución para admitir el enlace dinámico del código del método actual. En el archivo Class, se describe que un método llama a otros métodos, o el acceso a sus variables miembro está representado por referencias simbólicas La función del enlace dinámico es convertir los métodos representados por estas referencias simbólicas en referencias directas de métodos reales. En el proceso de carga de clases, las referencias de símbolo no resueltas se resolverán y el acceso a la variable se convertirá en el desplazamiento correcto de la ubicación de la memoria de tiempo de ejecución donde se accede a la estructura de almacenamiento de estas variables.

Debido a la existencia de enlaces dinámicos, los métodos y variables de otras clases que se utilizan a través del enlace tardío no afectarán al método que los llama cuando cambian.

2.2.4, completa la exportación

Se trata principalmente del retorno normal o final anormal del resultado de ejecución del método.

Ejemplo:

package com.example.learn.note.jvm;



public class TestStack {



    public static void main(String[] args) {



        // 对应main中code为0和1的指令

        int a = 1;

        // 对应main中code为2和3的指令

        int b = 2;

        test(a, b);

    }



    public static int test(int a, int b){

        // 对应test中code为0和2的指令

        int c = 10;

        // 对应test中code为3和4的指令

        int d = 2;

        int e = (a + b) * c / d;

        return e;

    }

}

Después de compilar la clase javac para generar el archivo de código de bytes de clase, desmóntelo

D: \ proyecto \ git-project \ learn-note-parent \ learn-note-common \ target \ classes \ com \ example \ learn \ note \ jvm> javap -c TestStack

Advertencia: el archivo binario TestStack contiene com.example.learn.note.jvm.TestStack

Compilado a partir de "TestStack.java"

public class com.example.learn.note.jvm.TestStack {

  public com.example.learn.note.jvm.TestStack();

    Code:

       0: aload_0

       1: invokespecial #1                  // Method java/lang/Object."

       4: return



  public static void main(java.lang.String[]);

    Code:

       // iconst将一个常量加载到操作数栈

       0: iconst_1

       // istore将一个数值从操作数栈存储到局部变量表

       1: istore_1

       2: iconst_2

       3: istore_2

       // iload将一个局部变量加载到操作栈

       4: iload_1

       5: iload_2

       // invokestatic指令用于调用类方法(static方法)

       6: invokestatic  #2                  // Method test:(II)I

       // pop出栈

       9: pop

      10: return



  public static int test(int, int);

    Code:

       // bipush将一个常量加载到操作数栈

       0: bipush        10

       2: istore_2

       3: iconst_2

       4: istore_3

       5: iload_0

       6: iload_1

       // iadd加法指令

       7: iadd

       8: iload_2

       // imul乘法指令

       9: imul

      10: iload_3

      // idiv除法指令

      11: idiv

      12: istore        4

      14: iload         4

      16: ireturn

}

3. Pila de métodos locales

Similar a la pila de máquinas virtuales, excepto que trata con métodos de modificación nativos

Las siguientes excepciones pueden ocurrir en la pila de métodos local:

Si la capacidad de la pila asignada por la solicitud de subproceso excede la capacidad máxima permitida por la pila del método local, la máquina virtual Java lanzará una excepción StackOverflowError.

Si la pila de métodos locales se puede expandir dinámicamente y se ha intentado la acción de expansión, pero actualmente no se puede solicitar suficiente memoria para completar la expansión, o no hay suficiente memoria para crear la pila de métodos local correspondiente al crear un nuevo hilo, entonces Java Virtual La máquina lanzará una excepción OutOfMemoryError.

4. Montón

En la máquina virtual Java, el montón (Heap) es un área de memoria en tiempo de ejecución que puede ser compartida por cada subproceso, y también es un área para todas las instancias de clase y objetos de matriz para asignar memoria. El montón de Java se crea cuando se inicia la máquina virtual y almacena varios objetos administrados por el GC.

Las siguientes excepciones pueden ocurrir en el montón de Java:

Si el montón real requerido excede la capacidad máxima que puede proporcionar el sistema de administración de memoria automática, la máquina virtual Java lanzará una excepción OutOfMemoryError.

5. Área de métodos

En la máquina virtual Java, el área de método es un área de memoria en tiempo de ejecución que puede ser compartida por cada hilo. Almacena la información estructural de cada clase, como el grupo de constantes de tiempo de ejecución (Grupo de constantes de tiempo de ejecución), datos de campos y métodos, el contenido de código de bytes de los constructores y métodos comunes, y algunos se utilizan en la inicialización de clases, instancias e interfaces. Método especial.

Las siguientes excepciones pueden ocurrir en el área de métodos:

Si el espacio de memoria del área de método no puede satisfacer la solicitud de asignación de memoria, la máquina virtual Java lanzará una excepción OutOfMemoryError.

6. Grupo de constantes en tiempo de ejecución

El grupo de constantes de tiempo de ejecución es la representación en tiempo de ejecución del grupo de constantes de cada clase o interfaz. Incluye varias constantes diferentes: desde el literal numérico conocido en el momento de la compilación hasta el método o la referencia de campo que debe analizarse en el tiempo de ejecución. Cada grupo de constantes de tiempo de ejecución se asigna en el área de métodos de la máquina virtual Java. Después de que las clases y las interfaces se cargan en la máquina virtual, se crea el grupo de constantes de tiempo de ejecución correspondiente.

Al crear el grupo constante de clases e interfaces en tiempo de ejecución, pueden ocurrir las siguientes excepciones:

Al crear una clase o interfaz, si el espacio de memoria requerido para construir el grupo de constantes de tiempo de ejecución excede el valor máximo que el área de método puede proporcionar, la máquina virtual Java lanzará una excepción OutOfMemoryError.

Supongo que te gusta

Origin blog.csdn.net/LuBanXue/article/details/108782146
Recomendado
Clasificación