Ciclo de vida detallado de la clase (1)

Carga de clase:

  • El producto final de la carga de clase es un Classobjeto ubicado en el montón
  • ClassEl objeto encapsula la estructura de datos de la clase en el área de método y proporciona una interfaz para el programador JAVA para acceder a la estructura de datos en el área de método
  • Tipos de cargadores de clases:
    1. El cargador que viene con la máquina virtual de Java
      (1) cargador de clase raíz (Bootstrap), escrito en C ++, no puede obtener la clase en el código de Java
      (2) cargador de clase de extensión (Extensión), usando el código Java para lograr el
      sistema (3) (O aplicación) cargador de clases (Sistema), utilizando código Java
    2. Cargador de clases definido por el usuario
      (1) Subclase de java.lang.ClassLoader
      (2) El usuario puede definir el método de carga de la
      clase 3. El cargador de clases no necesita esperar a que una clase se "use por primera vez" antes de cargarla:
      (1) La especificación jvm permite que la carga de clases precargue una clase cuando se espera que se use. Si .Classfalta un archivo o hay un error durante el proceso de precarga , el cargador de clases solo debe usar la clase cuando el programa usa activamente la clase por primera vez. Informe de errores (errores de LinkageError).
      (2) Si el programa no ha utilizado activamente una clase, el cargador de clases no informará un error.
      (3) Después de cargar la clase, entrará en la fase de conexión. La conexión es fusionar los datos binarios de la clase que se han leído en la memoria en el entorno de tiempo de ejecución de la máquina virtual.

Verificación de clase:

  • Inspección de estructura de archivos de clase: asegúrese de que los archivos de clase sigan el formato fijo de los archivos java
  • Inspección semántica: para garantizar que la clase en sí misma se ajusta a los requisitos de gramática del lenguaje Java, como verificar que la clase de tipo final no tenga subclases y que el método de tipo final no se sobrescriba (para evitar operaciones maliciosas por parte de usuarios maliciosos)
  • Verificación de bytecode: para garantizar que la máquina virtual de Java pueda ejecutar de forma segura la secuencia de bytecode. La secuencia de código de bytes representa métodos java (incluidos métodos estáticos y métodos de instancia). Es una secuencia de instrucciones de un solo byte llamadas códigos de operación, y cada código de operación es seguido por uno o más operandos. El paso de verificación del código de bytes verifica si cada código de operación es legal, es decir, si tiene operandos legales.
  • Verificación de compatibilidad binaria: para garantizar la coordinación entre las clases mutuamente referenciadas. Por ejemplo Worker, el goWork()método de la Carclase se llamará en el método de la clase run(). Cuando la máquina virtual Java verifica la Workerclase, verificará si Carel run()método de la clase existe en el área del método . Si no existe (cuando la versión de la Workerclase y la Carclase son incompatibles, se producirá este problema y NoSuchMethodErrorse generará un error)

Preparación de clase:

En la etapa de preparación, la máquina virtual de Java asigna memoria para las variables estáticas de la clase y establece el valor inicial predeterminado. Por ejemplo, para la siguiente Simpleclase, en la etapa de preparación, al inttipo de variable estática se le aasigna 4un byte de espacio de memoria y se le asigna un valor predeterminado 0. Asigne un byte de espacio de memoria para longuna variable estática de tipo y asigne un valor predeterminadob80

public class Simple {

    private static int a=1;
    public static long b;
    static {
        b=2;
    }
}

Etapa de resolución de clase:

En la fase de análisis, la máquina virtual Java reemplaza las referencias simbólicas en los datos binarios de la clase con referencias directas, por ejemplo Worker, los goWork()métodos de la Carclase están referenciados en los métodos de la clase run().

 public void goWork(){
        ca.run();//表示符号引用
    }

En Workerincluye una clase de datos binarios del método de referencias simbólicas, que consiste en el nombre completo de la clase y la composición descriptor método asociado. En la fase de resolución, la máquina virtual reemplaza directamente esta referencia de símbolo con un puntero, que apunta a la ubicación de memoria del método de la clase en el área de método. Este puntero es una referencia directa.Carrun()run()Carrun()

Inicialización de clase:

1. En la fase de inicialización, la máquina virtual Java ejecuta la instrucción de inicialización de clase y asigna valores iniciales a las variables estáticas de la clase. En el programa, hay dos formas de inicializar variables estáticas:

  • Inicializar en la declaración de variables estáticas
  • Inicializar en un bloque de código estático.
    Por ejemplo, en el siguiente código, ambas variables estáticas ay bse inicializan explícitamente, pero cno se inicializan explícitamente, mantendrán el valor predeterminado de forma predeterminada0
public class Simple {

    private static int a=1;
    public static long b;
    public static long c;
    static {
        b=2;
    }

}

2. Los pasos de inicialización de clase:

  • Si esta clase aún está disponible 没有加载和连接, cargue y conecte primero
  • Si la clase tiene una clase primaria directa, y la clase primaria no se ha inicializado, entonces inicialice primero la clase primaria directa
  • Si hay instrucciones de inicialización directa en la clase, ejecute estas instrucciones de inicialización en secuencia.

3. Tiempo de inicialización de la clase:
cuando la máquina virtual Java inicializa una clase, se requiere que todas sus clases primarias se inicialicen, pero esta regla no se aplica a las interfaces.

  • Al inicializar una clase, no inicializa primero la interfaz que implementa
  • Cuando se inicializa una interfaz, su interfaz principal no se inicializará primero
    , por lo tanto, una interfaz principal no se inicializará debido a la inicialización de su subinterfaz o clase de implementación, solo cuando el programa utiliza por primera vez una variable estática de una interfaz específica. Provoca la inicialización de la interfaz.

Fase de uso:

Todavía hay tres pasos en el uso de clases: creación de instancias de objetos, recolección de basura y terminación de objetos.

  • Creación de instancias de objeto: es el contenido del constructor en la clase de ejecución. Si hay una clase primaria en la clase, la JVM primero ejecutará el constructor de la clase primaria al mostrar o implícitamente, creando espacio para las variables de instancia de la clase primaria en la memoria del montón. Asigne el valor inicial predeterminado y luego asigne el valor real a la variable de instancia en sí de acuerdo con el contenido del código del constructor. Luego, haga referencia a la variable para obtener la primera dirección del objeto y llame a la variable de instancia y al método manipulando el objeto.
  • Recolección de basura: cuando el objeto ya no está referenciado, la máquina virtual lo marcará con una marca de basura especial y esperará la recolección de GC en el montón
  • El final del objeto: después de que el GC recicla el objeto, el objeto ya no existe y la vida del objeto llega a su fin

Desinstalar etapa:

Es decir, el ciclo de vida de la clase ha llegado al último paso. Ya no hay una referencia a la clase en el programa, y ​​la clase será basura recolectada por la JVM, y la vida terminará ...
Inserte la descripción de la imagen aquí

41 artículos originales publicados · Me gustaron 14 · Visitantes más de 10,000

Supongo que te gusta

Origin blog.csdn.net/Yunwei_Zheng/article/details/104018013
Recomendado
Clasificación