Mecanismo de carga de clases (1)

Prefacio


Después de estudiar mucho tiempo el conocimiento orientado a objetos, debemos estar familiarizados con el concepto de "clase". Cuando necesitamos un objeto, lo obtenemos a través de "clase", incluida la reflexión que aprendemos, y también se obtiene a través de la clase. Algo de información, resumamos hoy, cómo la JVM carga las clases en la memoria

mapas mentales

Escriba la descripción de la imagen aquí

¿Qué es la carga de clases?

La JVM carga el archivo de clase en la memoria, verifica, prepara, analiza e inicializa los datos y, finalmente, se puede formar en un proceso de tipo Java que puede ser utilizado directamente por la JVM.

El proceso de carga de clases

El proceso de carga de la clase pasa por varios procesos, primero es la carga, luego la conexión (la conexión se divide en tres pequeños pasos: verificación, preparación, análisis), inicialización y luego puede usarla, pero su orden no está exactamente de acuerdo con esto Un proceso también tiene una parte cruzada. Por ejemplo, la carga y la verificación pueden cruzarse. La verificación de la verificación de la referencia del símbolo ocurre durante la fase de análisis. Resumamos lo que estos pasos han hecho respectivamente.

Escriba la descripción de la imagen aquí

1. Cargando (3 cosas)

  1. Obtenga el flujo de bytes binarios que define esta clase a través del nombre completo de una clase.
  2. La estructura de almacenamiento estática representada por este flujo de bytes se transforma en la estructura de datos en tiempo de ejecución del área de métodos.
  3. Un objeto java.lang.Class que representa esta clase se genera en la memoria como la entrada de acceso para varios datos de esta clase en el área de métodos. (Objeto reflectante)

2. Verificación (asegúrese de que la información de la clase cargada cumpla con la especificación JVM y que no haya ningún problema de seguridad)

  • Verificación del formato de archivo
  • Verificación de metadatos
  • Verificación de bytecode
  • Verificación de referencia de símbolo

Tres, prepárate

Asigne formalmente memoria para la variable de clase (estática) y establezca el valor inicial de la variable de clase, esta memoria se asignará en el área de método

public static int value=123; //初始后为 value=0;
//对于static final类型,在准备阶段会被赋予正确的值
public static final value=123;//初始化为 value=123;
//如果是boolean值默认赋值为:false
//如果是对象引用默认赋值为:null

Cuatro, análisis

El proceso de reemplazar referencias de símbolo en el grupo constante con referencias directas
1. Referencias de símbolo: el entendimiento simple es una cadena, como hacer referencia a una clase, java.util.ArrayList Esta es una referencia de símbolo y el objeto referenciado por la cadena no está necesariamente cargado.
2. Referencia directa: puntero o desplazamiento de dirección. El objeto referenciado debe estar en la memoria (ya cargado).

Escriba la descripción de la imagen aquí

Cinco, inicialización

  1. Método de ejecución del constructor de clases <clinit> ()
  2. Este método es generado por el compilador que recopila automáticamente las acciones de asignación de todas las variables de clase en la clase y la declaración en el bloque de instrucciones estáticas.
  3. Antes de llamar a la subclase, asegúrese de que se llame a la <clinit> de la clase principal
  4. El método <clinit> () está correctamente bloqueado y sincronizado en un entorno multiproceso

Nota:
<clinit> () es seguro para subprocesos. El subproceso que ejecuta <clinit> () necesita adquirir el bloqueo antes de realizar la operación de inicialización, asegurándose de que solo un subproceso pueda ejecutar <clinit> () (el uso de esta función puede lograr la pereza segura para subprocesos Modo singleton).

Demo-cambios en la memoria

Escriba la descripción de la imagen aquí

Escriba la descripción de la imagen aquí

Cuadro de análisis de memoria:
Escriba la descripción de la imagen aquí

1. La parte verde de la derecha es el proceso de carga de Demo1 y Clase A.
2. Empuje el marco de pila del método principal en la pila y luego genere un objeto en el montón y asigne la dirección de referencia a un
3. Empuje el marco de pila del método de construcción de A En la pila, imprima los recursos estáticos en el área de método de la clase A

¿Cuándo se cargará la clase?

Referencia activa (la inicialización de la clase definitivamente ocurrirá)

  1. nuevo un objeto.
  2. Llame a miembros estáticos (excepto constantes finales) y métodos estáticos de la clase.
  3. Llame a la clase a través de la reflexión.
  4. La máquina virtual se inicia y la clase donde se encuentra el método principal se inicializa de antemano.
  5. Inicialice una clase, si su clase principal no está inicializada, inicialice la clase principal primero.

Referencia pasiva (no se producirá ninguna inicialización de clase)

  1. Al acceder a una variable estática, solo se inicializará la clase que realmente declara la variable. (La clase secundaria llama a la variable estática de la clase principal, solo se inicializa la clase principal y la clase secundaria no se inicializa).
  2. La definición de referencias de clase a través de matrices no activará la inicialización de esta clase.
  3. Las variables finales no activarán dicha inicialización, porque se almacenan en el grupo constante durante la fase de compilación.
public class Demo1 {
    
    
    static{
        System.out.println("静态初始化Demo1");
    }
    public static void main(String[] args) {
        //1. age真正的类会被初始化
        System.out.println(B.age);
        //2. 数组不会初始化
        A[] as=new A[10];
        //3.调用类的final常量不会初始化A:被动引用
        System.out.println(A.MAX);
    }
}
class A extends A_Father {
    
    
    public static int age = 24;
    public static final int MAX=100;
    static {
        System.out.println("静态初始化类A");
        age = 25;
    }
    public A() {
        System.out.println("创建A类的对象");
    }
}

class A_Father{
    
    
    static{
        System.out.println("静态初始化A_Father");
    }
}

class B extends A{
    
    
    static{
        System.out.println("静态初始化B");
    }
}

Supongo que te gusta

Origin blog.csdn.net/cd18333612683/article/details/79199385
Recomendado
Clasificación