¿Cómo carga JVM los archivos de código de bytes?

 Una vez que el compilador de Java ha compilado el archivo .class, necesitamos usar la JVM para ejecutar el archivo de clase. Luego, el primer trabajo es importar el código de bytes del disco a la memoria, este proceso se llama [ carga  ]. Una vez completada la carga, podemos llevar a cabo una serie de preparaciones previas a la ejecución, como: abrir espacio para las variables estáticas de clase, almacenar el grupo constante en la memoria del área de método y realizar la resolución de la dirección del grupo constante, inicializar las variables estáticas de clase, etcétera. En este artículo, vamos a hablar sobre cómo la JVM carga archivos de clases.

Mecanismo de carga de clases

El ciclo de vida de una clase desde que se carga en la memoria de la máquina virtual hasta que se descarga la memoria incluye: carga -> conexión (verificación -> preparación -> análisis) -> inicialización -> uso -> descarga

imagen


  • Carga

    • Cargar el contenido de código de bytes de la archivo de clase en la memoria, y convertir estos datos estáticos en la estructura de datos de tiempo de ejecución en el área de método, y generar un objeto java.lang.Class que representa esta clase en el montón como los datos de la clase zona método para acceder La entrada, este proceso requiere la participación del cargador de clases.

  • Vincular     el proceso de fusión del código binario de la clase java en el estado de ejecución de la JVM

    •   Verificación: asegúrese de que la información de la clase cargada cumpla con la especificación de JVM y que no haya ningún problema de seguridad


    •   Preparación: etapa de asignación formal de memoria para variables de clase (variables estáticas ) y establecimiento del valor inicial de las variables de clase, estas memorias serán asignadas en el método.


    •   Análisis: el proceso de reemplazar referencias de símbolos en el grupo de constantes de la máquina virtual con referencias de bytes.

  • inicialización

    • La fase de inicialización es el proceso de ejecutar el método <clinit> () del constructor de la clase . El método del constructor de clases <el clinit> () se implementa mediante la operación del compilador de asignación automática colección de clases y variables estáticas de todas las clases bloques de instrucciones ( bloque estático ) combinación de declaraciones

    • Al inicializar una clase, si encuentra que su clase principal no se ha inicializado, primero debe activar la inicialización de su clase principal

    • La máquina virtual garantiza que el método <clinit> () de una clase esté correctamente bloqueado y sincronizado en un entorno de subprocesos múltiples.

    • Cuando el dominio estático de una clase Java tiene un alcance , solo se inicializará la clase que realmente reclame este dominio

La clase de carga de Java utiliza el "mecanismo de delegación de responsabilidad total":

Significa que cuando un ClassLoader carga una clase, a menos que se use otro ClassLoader, las clases de las que depende la clase y la referencia también son cargadas por este ClassLoader. El "mecanismo de delegación" se refiere a confiar primero al cargador de clases padre para que encuentre la clase de destino, y solo la encuentre y cargue desde su propia ruta cuando no se pueda encontrar. Este punto se considera desde el punto de vista de la seguridad. Imagínese si alguien escribe una clase básica maliciosa (como java.lang.String) y la carga en la JVM, causará graves consecuencias, pero la responsabilidad general, java.lang.String siempre estará cargado por el cargador raíz para evitar la situación anterior.


Supongo que te gusta

Origin blog.51cto.com/15082402/2644355
Recomendado
Clasificación