Anotaciones y reflexión de Java (cinco) --- análisis de memoria de carga de clase

1. Análisis de memoria Java

Inserte la descripción de la imagen aquí
Hablemos sobre la carga de clases y luego use una instancia para analizar esta memoria

2. Proceso de carga de clase

Cuando el programa usa activamente una clase, si la clase no se ha cargado en la memoria, el sistema inicializará la
Inserte la descripción de la imagen aquí
clase a través de los siguientes tres pasos: Carga de clase y comprensión de ClassLoader
[1] Carga: El contenido del código de bytes del archivo de clase Cárguelo en la memoria y convierta estos datos estáticos en la estructura de datos de tiempo de ejecución del área del método , y luego genere un objeto java.lang.Class que represente este
enlace de clase [2]: combine el código binario de la clase java en el estado de ejecución JVM Proceso en

  • Verificación: asegúrese de que la información de la clase cargada se ajusta a la especificación JVM y no hay problemas de seguridad
  • Preparación: asigne oficialmente memoria para las variables de clase (estática) y establezca la etapa de atravesar el valor inicial predeterminado . Estas memorias se asignarán en el área de método
  • Resolución: el proceso de reemplazar la referencia de símbolo (nombre constante) en el grupo constante de máquina virtual con una referencia directa (dirección)

[3] Inicialización:

  • El proceso de ejecución del método constructor de clase (). El compilador genera el método constructor de clase (), recolectando activamente las acciones de asignación de todas las variables de clase en la clase y fusionando las declaraciones en el bloque de código estático . (El constructor de la clase construye la información de la clase, no el constructor que construye los objetos de esa clase)
  • Al inicializar una clase, si encuentra que su clase principal no se ha inicializado, primero debe activar la inicialización de la clase primaria
  • La oportunidad virtual garantiza que el método clint () de una clase se bloquee y sincronice correctamente en un entorno multiproceso

Después de muchas teorías anteriores, comprendamos este proceso a través de un ejemplo específico

package com.gs.reflection;

//测试类的加载
public class Test05 {
    public static void main(String[] args) {
        A a = new A();
        System.out.println(A.m);

     
    }
}
class A{

    static{
        System.out.println("A类静态代码初始化");
        m = 300;
    }
    static int m = 100;
    public A(){
        System.out.println("A类的无参构造器初始化");
    }
}

Resultados del código anterior:
Inserte la descripción de la imagen aquí
analice los resultados:

  1. Cargar: cuando se ejecuta el código, primero cargue el contenido del código de bytes de los archivos de clase A y Test05 en la memoria, y coloque los datos relevantes en el área de método; finalmente generarán la clase java.lang.Class correspondiente en el montón.
  2. Enlace, asigne valores iniciales a bloques de código estático, y directamente haga referencia a constantes => aquí corresponde al código anterior es restablecer la variable estática m al valor inicial de 0
  3. Inicialización, podemos ver en el análisis anterior que es ejecutar primero las acciones de asignación de todas las variables de clase y las instrucciones de bloque de código estático, y luego inicializar.
    Por lo tanto, su orden de ejecución es:
    [1] clinit () {
    System.out.println ("Inicialización de código estático de clase A");
    m = 300;
    m = 100;
    }
    [2] Inicialización de clase A

Tabla de análisis de memoria relacionada
Inserte la descripción de la imagen aquí

El contenido anterior se refiere a las anotaciones y reflexiones en Java

Publicado 82 artículos originales · elogiado 6 · visitas 6872

Supongo que te gusta

Origin blog.csdn.net/TheWindOfSon/article/details/105520834
Recomendado
Clasificación