Serie JVM (5) - proceso de carga de clase

1. El ciclo de vida de una clase

Carga, Verificación, Preparación, Resolución, Inicialización, Uso y Descarga.
Mira la imagen:
inserte la descripción de la imagen aquí

En segundo lugar, el proceso de carga de clases.

inserte la descripción de la imagen aquí

1. Carga

El primer paso en el proceso de carga de clases completa principalmente las siguientes tres cosas:

1. Obtenga el flujo de bytes binarios que define esta clase a través del nombre completo de la clase.
2. Convierta la estructura de almacenamiento estática representada por el flujo de bytes en la estructura de datos de tiempo de ejecución del área de métodos.
3. Genere un objeto Clase que represente la clase en la memoria como la entrada de acceso para los datos en el área del método.

En resumen, el proceso de carga consiste en convertir la clase en un flujo de bytes binarios, generar un objeto Clase y colocarlo en el área de métodos, de estático a dinámico.
inserte la descripción de la imagen aquí

Este paso de carga se realiza principalmente a través del cargador de clases. El cargador de clases se puede personalizar, lo cual se explicará en detalle en el siguiente artículo.

Cada clase de Java tiene una referencia al ClassLoader que la cargó. Sin embargo, la clase de matriz no se crea a través de ClassLoader, sino que la JVM la crea automáticamente cuando es necesario. Cuando la clase de matriz obtiene el ClassLoader a través del método getClassLoader(), es coherente con el ClassLoader del tipo de elemento de la matriz.

2. Conexión

2.1 Verificación

Asegúrese de que la información contenida en el flujo de bytes del archivo Class cumpla con todas las restricciones de la "Especificación de máquina virtual Java" y asegúrese de que la información no ponga en peligro la seguridad de la máquina virtual después de ejecutarse como código.
Verifique que el archivo cumpla con la especificación JVM.

2.2 preparación

Asigna formalmente memoria y establece valores iniciales para variables miembro estáticas.
La función del área de métodos: se utiliza para almacenar datos tales como información de clase, constantes, variables estáticas, código compilado por el compilador justo a tiempo, etc. que han sido cargados por la máquina virtual.
Entonces, la memoria asignada está en el área de métodos.
Antes de JDK8, la implementación del área de método en Hotspot era la generación permanente (Perm). JDK8 comenzó a usar el metaespacio (Metaspace). Las constantes de cadena de todos los contenidos de la generación permanente se movieron a la memoria del montón, y otros contenidos se movieron al metaespacio. El metaespacio se asigna directamente en la memoria local. El tamaño del metaespacio depende del tamaño de la memoria local.
De: serie JVM (1) - área de memoria java

public static int value=111;   //准备阶段初始值为0
public static final int value=111;   //准备阶段初始值为111

inserte la descripción de la imagen aquí

2.3 Análisis

La máquina virtual reemplaza las referencias simbólicas en el grupo constante con referencias directas. Obtenga el puntero o el desplazamiento de una clase, campo o método en la memoria.
inserte la descripción de la imagen aquí

3. Inicialización

La fase de inicialización es el proceso de ejecución del método de inicialización (), que asignará valores iniciales a las variables miembro estáticas.
Situaciones en las que se debe inicializar la clase (la clase se inicializará solo cuando la clase se use activamente):
(1) nuevo objeto;
(2) reflexión;
(3) el programa accede a la variable estática de la clase, o el programa asigna un valor a la variable estática de la clase.
(4) El programa llama al método estático de la clase;
(5) Inicializa una clase, si su clase principal no se ha inicializado, luego activa primero la inicialización de la clase principal.
(6) Cuando se inicia la máquina virtual, el usuario debe definir una clase principal para ejecutar (la clase que contiene el método principal), y la máquina virtual inicializa esta clase primero.
(7) Cuando se define un método predeterminado recientemente agregado por JDK8 (método de interfaz modificado por la palabra clave predeterminada) en una interfaz, si la clase de implementación de esta interfaz se inicializa, la interfaz debe inicializarse antes.

Supongo que te gusta

Origin blog.csdn.net/liwangcuihua/article/details/131685959
Recomendado
Clasificación