[Java] Aprendizaje de JVM (2)

Área de memoria de JVM

área de datos de tiempo de ejecución

Definición del área de datos de tiempo de ejecución:

Durante la ejecución de un programa Java, la máquina virtual Java divide la memoria que administra en varias áreas de datos diferentes.

Java se enorgullece de su mecanismo automático de gestión de memoria. En comparación con la gestión manual de la memoria de C++, los punteros complejos y difíciles de entender, etc., los programas Java son mucho más cómodos de escribir.

Entonces, para tener una comprensión profunda 内存虚拟化de los conceptos que debe comprender la JVM.

En la JVM, la memoria de la JVM se divide principalmente en , 程序计数器, 方法区y 虚拟机栈así 本地方法栈sucesivamente.
Al mismo tiempo, según la relación con el hilo, el área también se puede dividir de la siguiente manera:

线程私有区域: Un hilo tiene un área de memoria separada.

线程共享区域: Compartido por todos los hilos, y solo hay una copia.

Aquí hay otro 直接内存, aunque esto no es parte del área de datos de tiempo de ejecución, se usará con frecuencia. Puede entenderlo como otra memoria en el sistema operativo que no se ha virtualizado (por ejemplo, hay memoria 8G en el sistema operativo y 3G está virtualizada por la JVM, por lo que todavía quedan 5G. La JVM usa esta memoria 5G con la ayuda de algunas herramientas. Esta memoria en parte se llama memoria directa)

inserte la descripción de la imagen aquí

Operación del método JAVA y pila de máquina virtual

虚拟机栈是用来存放线程运行java方法所需的数据,指令、返回地址。

inserte la descripción de la imagen aquí

Este código es muy simple: inicia un método principal, llama al método A mientras se ejecuta el método principal, llama al método B en el método A y ejecuta el método C en el método B.

Ejecutamos el código, el subproceso 1 ejecuta este código, y cuando se ejecuta el subproceso 1, habrá una pila de máquina virtual correspondiente y, al mismo tiempo, se empaquetará en un marco de pila cuando se ejecute cada método.

Por ejemplo, main comienza a ejecutarse, empaqueta un marco de pila y lo envía a la pila de la máquina virtual.

inserte la descripción de la imagen aquí

Después de que el método C termina de ejecutarse, el método C abre la pila, luego el método B termina de ejecutarse, el método B termina de ejecutarse, luego el método A termina de ejecutarse, el método A abre la pila y, finalmente, el método principal termina de ejecutarse. y se abre el marco de la pila del método principal.

Este es un impacto del método Java que se ejecuta en la pila de la máquina virtual. La pila de la máquina virtual se utiliza para almacenar datos en el método de ejecución de subprocesos. Y cada método corresponde a un marco de pila.

pila de máquinas virtuales

栈的数据结构: estructura de datos First in last out (FILO),

虚拟机栈的作用: almacene los datos, las instrucciones y las direcciones de retorno requeridas por el subproceso actual para ejecutar el método durante la ejecución de la JVM.

虚拟机栈是基于线程的: Incluso si solo tiene un método main(), se ejecuta como un hilo. En el ciclo de vida de un subproceso, los datos involucrados en el cálculo se insertarán y extraerán con frecuencia de la pila, y el ciclo de vida de la pila es el mismo que el del subproceso.

栈帧: Cuando se llama a cada método Java, se creará un marco de pila y se colocará en la pila. Una vez que el método completa la llamada correspondiente, se abre.

El marco de pila generalmente incluye cuatro áreas: (tabla de variables locales, pila de operandos, enlace dinámico, dirección de retorno)
1、局部变量表:

Como su nombre lo indica, es una tabla de variables locales, que se utiliza para almacenar nuestras variables locales (variables en el método). En primer lugar, tiene una longitud de 32 bits. Almacena principalmente los ocho tipos de datos básicos de nuestro Java. Generalmente, se pueden almacenar 32 bits. Si es de 64 bits, se puede almacenar utilizando los bits alto y bajo. Si se trata de algunos objetos For, como nuestro objeto Object, solo necesitamos almacenar una dirección de referencia del mismo.

2、操作数据栈:
Almacena los operandos ejecutados por el método Java. Es una pila. La estructura de pila primero en entrar, último en salir y la pila de operandos se utilizan para las operaciones. Los elementos de la operación pueden ser cualquier tipo de datos Java, por lo que sabemos que un método acaba de comenzar, la pila de operandos de este método está vacía.

La pila de operandos es esencialmente un área de trabajo del motor de ejecución de JVM, es decir, la pila de operandos se operará cuando el método se esté ejecutando.Si el código no se ejecuta, la pila de operandos en realidad está vacía.

3、动态连接:
Polimorfismo de características del lenguaje Java.

4、返回地址:
Retorno normal (llame a la dirección en el contador del programa como retorno), excepción (determinada por la tabla del controlador de excepciones <en el marco que no es de pila>)

Al mismo tiempo, la memoria de la pila de la máquina virtual no es infinita, tiene un límite de tamaño, por defecto es de 1M.
Si continuamos insertando marcos en la pila de la máquina virtual, pero si simplemente no salimos de la pila, la pila de la máquina virtual explotará.

contador de programa

Espacio de memoria más pequeño, el indicador de número de línea del código de bytes ejecutado por el subproceso actual; cada subproceso se almacena de forma independiente y no se afecta entre sí.

El contador del programa se 一块很小的内存空间utiliza principalmente para registrar la dirección del bytecode ejecutado por cada subproceso, por ejemplo, bifurcaciones, bucles, saltos, excepciones, recuperación de subprocesos, etc., todo depende del contador.

Dado que Java es un lenguaje de subprocesos múltiples, cuando la cantidad de subprocesos en ejecución supera la cantidad de núcleos de CPU, los subprocesos competirán por los recursos de CPU de acuerdo con el sondeo de intervalos de tiempo. Si se agota el segmento de tiempo de un subproceso u otras razones hacen que los recursos de la CPU del subproceso se roben por adelantado, entonces el subproceso existente necesita un contador de programa separado para registrar la siguiente instrucción en ejecución.

Debido a que la JVM es una máquina virtual, hay un conjunto completo de instrucciones y procedimientos de ejecución en su interior, por lo que debe usar el contador del programa (registrar la dirección o el número de línea de la ejecución del código de bytes) al ejecutar el método Java. método native (método nativo), este método no es ejecutado específicamente por la JVM, por lo que no es necesario registrar el contador de programa, ya que también existe un contador de programa a nivel del sistema operativo, que registrará la dirección de ejecución de el código nativo, por lo que cuando se ejecuta el método nativo, en la JVM, el valor del contador del programa está vacío (indefinido).
Además, el contador del programa también es la única área de memoria en la JVM que no OOM (OutOfMemory).

Efecto de la ejecución del marco de pila en el área de memoria

inserte la descripción de la imagen aquí
En la JVM, este método basado en interpretación y ejecución es un motor basado en pila.La pila mencionada aquí es la pila de operandos.

虚拟机栈:

Cada subproceso es privado, y cuando el subproceso se ejecuta, se empaquetará en un marco de pila al ejecutar cada método, almacenando la tabla de variables locales, la pila de operandos, el enlace dinámico, la salida del método y otra información, y luego lo colocará en la pila. El método actual que se ejecuta en cada momento es el marco de la pila en la parte superior de la pila de la máquina virtual. La ejecución del método corresponde al proceso de empujar y sacar el marco de la pila en la pila de la máquina virtual.

El tamaño predeterminado de la pila es 1M, y el tamaño se puede ajustar con el parámetro -Xss, por ejemplo -Xss256k

Al compilar el código del programa, se determinó por completo la cantidad de tabla de variables locales y la profundidad que debe tener la pila de operandos en el marco de la pila, y se escribió en el atributo Código de la tabla de métodos, por lo tanto, ¿cuánta memoria necesita un marco de pila? asignar, no se verá afectado por datos variables durante el tiempo de ejecución del programa, sino que solo depende de la implementación específica de la máquina virtual.

局部变量表:

Como su nombre lo indica, es una tabla de variables locales, que se utiliza para almacenar nuestras variables locales. En primer lugar, tiene una longitud de 32 bits. Almacena principalmente los ocho tipos de datos básicos de nuestro Java. Generalmente, se pueden almacenar 32 bits. Si es de 64 bits, se puede almacenar utilizando los bits alto y bajo. Si se trata de algunos objetos For, como nuestro objeto Object, solo necesitamos almacenar una dirección de referencia del mismo. (tipo de datos básicos, referencia de objeto, tipo returnAddress)

操作数据栈:

Almacena los operandos ejecutados por nuestro método. Es una pila. La estructura de pila de primero en entrar, último en salir, la pila de operandos, se usa para operaciones. Los elementos de la operación pueden ser cualquier tipo de datos de Java, por lo que sabemos que un El método acaba de comenzar, la pila de operandos de este método está vacía y el método de operación de la pila de operandos siempre ejecutará la operación de apilamiento/extracción.

动态连接:

Polimorfismo de características del lenguaje Java (requiere carga de clase y tiempo de ejecución para determinar el método específico) despacho dinámico

完成出口(返回地址):

Retorno normal: (Dirección de llamada en contador de programa como retorno)

Restaure la tabla de variables locales y la pila de operandos del método de nivel superior,
inserte el valor de retorno (si lo hay) en la pila de operandos del marco de pila de la persona que llama y
ajuste el valor del contador del programa para que apunte a una instrucción después de la llamada al método. instrucción

Si hay una excepción: (determinado por la tabla de manejo de excepciones <en el marco no apilado>)

Supongo que te gusta

Origin blog.csdn.net/qq_43358469/article/details/131390659
Recomendado
Clasificación