Notas de estudio de estructura de JVM

JVM se puede dividir en 5 partes

1. Cargador de clases (Cargador de clases)

2. Área de datos en tiempo de ejecución

3. Motor de ejecución (motor de ejecución)

4. Interfaz nativa (interfaz nativa)

5. Libraies nativos

El más complicado de ellos es el área de datos en tiempo de ejecución, que se puede dividir en área de método, pila de máquina virtual, montón y contador de programa. El área de método y el montón son compartidos por subprocesos. La pila de máquina virtual, la pila de método local y el contador de programa son subprocesos aislados. Sí, la estructura de JVM se muestra en la siguiente figura.
Inserte la descripción de la imagen aquí
Después de comprender la estructura de la máquina virtual JVM, explicaremos cada parte de ella en detalle.
Cargador de clases: carga archivos de código de bytes en la memoria

Motor de ejecución: analizar la instrucción JVM, traducirla a código de máquina y enviarla al sistema operativo una vez finalizado el análisis.

Interfaz de biblioteca nativa: una biblioteca nativa que integra diferentes lenguajes de desarrollo para llamadas Java.

Biblioteca de métodos locales: la realización concreta del método local de Java

Área de datos en tiempo de ejecución: modelo de estructura de espacio de memoria del núcleo de JVM

El área de datos en tiempo de ejecución es la parte más importante de la estructura de la memoria JVM A continuación, explicaremos en detalle los distintos componentes del área de datos en tiempo de ejecución.

1. Área de métodos

El área de método almacena información de clase, constantes y variables estáticas cargadas por la máquina virtual. Datos como el código compilado por el compilador Just-In-Time. El área del método es una norma. La generación permanente es una implementación del área de métodos. Aquí hay una pregunta de entrevista que se prueba con frecuencia: el grupo de constantes de cadena de la versión anterior de jdk7 se colocó en la generación permanente, jdk7 movió el grupo de constantes de cadena al montón y jdk8 se eliminó directamente Generación permanente, use metaespacio en lugar de generación permanente.

2. Pila de métodos locales

La función y el principio de la pila de métodos local y la pila de Java son los mismos, y ambos se pueden utilizar para ejecutar métodos. La diferencia es que la pila de Java ejecuta métodos de Java y la pila de métodos local ejecuta métodos locales.

3. Programar temporizador

El contador de programa ocupa un pequeño espacio de memoria y es un indicador del número de línea de código de bytes ejecutado por el hilo actual Al cambiar el valor de este contador, seleccione las instrucciones de código de bytes que deben ejecutarse. Los temporizadores del programa entre varios subprocesos son independientes entre sí y no se afectan entre sí, para garantizar que cada subproceso pueda encontrar una ubicación específica después de la recuperación.

4 montón de Java

El montón de Java se utiliza para almacenar objetos instanciados. El montón de Java es compartido por todos los subprocesos. Se crea cuando la máquina virtual comienza a almacenar instancias de objetos. Es la mayor parte de la estructura de memoria de Java y ocupa la mayor parte del espacio. Es el área de administración principal del GC. Se puede dividir en generación joven, generación anterior, generación permanente, jdk8 y luego se elimina la generación permanente.

5. Pila de máquinas virtuales

El modelo de memoria de ejecución del método Java, múltiples marcos de pila almacenados en la pila de Java, cada marco de pila corresponde a un método llamado, que incluye principalmente tabla de variables locales, pila de operandos, conexión dinámica, dirección de retorno del método. Para la ejecución de cada método, jvm creará un marco de pila y empujará el marco de pila a la pila de Java. Después de que se ejecute el método, el marco de pila se abrirá.
Inserte la descripción de la imagen aquí

Tabla de variables locales

Almacene todas las variables en la ejecución del método, incluidas las variables locales y los parámetros formales declarados en el método.

Pila de operandos

El proceso de cálculo en el método se basa en la pila de operandos.

El método de operación específico de la pila es así, el compilador se implementa mediante dos pilas, una es la pila que guarda los operandos y la otra es la pila que salva los operadores. Atravesamos la expresión de izquierda a derecha, y cuando encontramos un número, lo empujamos directamente a la pila de operandos. Al encontrar un operador, primero compárelo con el elemento superior de la pila de operadores, si es mayor que la prioridad del elemento superior de la pila actual, empújelo directamente; de ​​lo contrario, elimine al operador en la parte superior de la pila actual y saque los dos primeros de la pila de operandos al mismo tiempo Se opera con los datos y el resultado se inserta en la pila de operandos. Repita los pasos anteriores nuevamente hasta que el operador actual sea empujado a la pila. Cuando no sea necesario empujar a un nuevo operador a la pila, saque el elemento superior de la pila actual y las dos operaciones de la pila de operandos, realice la operación y empuje el resultado Pila de operandos, si se requiere el valor de retorno cuando se define el método, simplemente devuelva el elemento superior de la pila de operandos directamente

Dirección de devolución del método

Una vez que finaliza una llamada a un método, vuelve al lugar donde se llamó, por lo que el marco de pila debe conservar la dirección que puede volver a la llamada al método.

Supongo que te gusta

Origin blog.csdn.net/weixin_46011971/article/details/108906035
Recomendado
Clasificación