Comprensión profunda de la segunda edición del mecanismo de carga de clase de máquina virtual Java Virtual Machine (7)

El proceso de carga de clases (carga, verificación, preparación, resolución, inicialización); cargador de clases (cargador de clases inicial, cargador de clases extendido, cargador de clases de aplicaciones, cargador de clases personalizado); modelo de delegación principal;

 

1. Mecanismo de carga de clase de la máquina virtual:

La máquina virtual carga los datos que describen la clase del archivo de Clase en la memoria y verifica, convierte, analiza e inicializa los datos, y finalmente forma un tipo Java que puede ser utilizado directamente por la máquina virtual.

2. El ciclo de vida de la clase:

 

3. Cinco situaciones en las que se debe inicializar la clase:

  • Cuando encuentre 4 instrucciones de bytecode nuevas, getstatic, putstatic o invokestatic
  • Al usar el método de paquete java.lang.reflect para hacer una llamada reflexiva a la clase
  • Al inicializar una clase, si encuentra que su clase principal no se ha inicializado, primero debe activar la inicialización de su clase principal.
  • Cuando se inicia la máquina virtual, el usuario debe especificar una clase principal que se ejecutará (la clase que contiene el método main ()), y la máquina virtual primero inicializa esta clase principal.
  • Cuando se utiliza el soporte de lenguaje dinámico de JDK 1.7, si el resultado del análisis final de una instancia de java.lang.invoke.MethodHandle es el identificador de método de REF_getStatic, REF_putStatic, REF_invokeStatic, y la clase correspondiente a este identificador de método no se ha inicializado, primero debe activarse. Su inicialización.

4. Cita

Referencia activa: el comportamiento en 5 situaciones en las que se debe inicializar una clase.

Referencia pasiva: excepto en 5 casos, todos los métodos de referencia de clases no activarán la inicialización

5. El proceso de carga de clases.

Todo el proceso de carga de clases en la máquina virtual Java, es decir, las cinco etapas de carga, verificación, preparación, análisis e inicialización.

5.1 Carga

Durante la fase de carga, la máquina virtual necesita completar las siguientes tres cosas:

  • 1) Obtenga la secuencia de bytes binarios que define esta clase por su nombre completo.
  • 2) Convierta la estructura de almacenamiento estática representada por este flujo de bytes en la estructura de datos de tiempo de ejecución del área de método.
  • 3) Genere un objeto java.lang.Class que represente esta clase en la memoria como un punto de acceso a varios datos de esta clase en el área del método.

5.2 Verificación

La verificación es el primer paso en la fase de conexión. El objetivo de esta fase es garantizar que la información contenida en el flujo de bytes del archivo de Clase cumpla con los requisitos de la máquina virtual actual y no ponga en peligro la seguridad de la máquina virtual.

La etapa de verificación generalmente completará las siguientes cuatro etapas de acciones de verificación: verificación de formato de archivo, verificación de metadatos, verificación de código de byte y verificación de referencia de símbolo.

  • 1. Verificación del formato de archivo: para verificar si la secuencia de bytes se ajusta a las especificaciones del formato de archivo de la Clase y si puede ser procesada por la versión actual de la máquina virtual. Por ejemplo: si comenzar con el número mágico 0xCAFEBABE. Si los números de versión mayor y menor están dentro del rango de procesamiento de la máquina virtual actual.
  • 2. Verificación de metadatos: realice un análisis semántico de la información descrita por el código de bytes para garantizar que la información descrita cumpla con los requisitos de la especificación del lenguaje Java. por ejemplo: ¿Esta clase tiene una clase padre, la clase padre de esta clase hereda una clase que no se permite heredar?
  • 3. Verificación de código de bytes: a través del flujo de datos y el análisis del flujo de control, se determina que la semántica del programa es legal y lógica. El cuerpo del método de la clase se verificará y analizará para garantizar que el método de la clase marcada no genere un evento que ponga en peligro la seguridad de la máquina virtual durante el tiempo de ejecución
  • 4. Verificación de referencia de símbolos: cuando la máquina virtual convierte la referencia de símbolos en una referencia directa, puede verse como una verificación de coincidencia para obtener información fuera de la clase misma (varias referencias de símbolos en el grupo constante)

ps: en la etapa de implementación, puede considerar usar el parámetro -Xverify: none para desactivar la mayoría de las medidas de verificación de clase para acortar el tiempo de carga de clase de la máquina virtual.

5.3 Preparación

La etapa de preparación es la etapa de asignar oficialmente memoria para las variables de clase y establecer los valores iniciales de las variables de clase . La memoria utilizada por estas variables se asignará en el área del método

 

5.4 Análisis

La fase de resolución es el proceso donde la máquina virtual reemplaza las referencias de símbolos en el grupo constante con referencias directas.

Referencias de símbolos (Referencias simbólicas): las referencias de símbolos utilizan un conjunto de símbolos para describir el objetivo al que se hace referencia. El símbolo puede ser cualquier forma de literal, siempre que se pueda utilizar para localizar el objetivo sin ambigüedad.

Referencias directas: las referencias directas pueden ser punteros directamente al objetivo, desplazamientos relativos o un identificador que se puede ubicar indirectamente en el objetivo.

La acción de resolución es principalmente para 7 tipos de referencias de símbolos, como clase o interfaz, campo, método de clase, método de interfaz, tipo de método, identificador de método y calificador de punto de llamada,

7 tipos constantes correspondientes a CONSTANT_Class_info, CONSTANT_Fieldref_info, CONSTANT_Methodref_info, CONSTANT_InterfaceMethodref_info, CONSTANT_MethodType_info, CONSTANT_MethodHandle_info y CONSTANT_InvokeDynamic_info del grupo constante

5.5 Inicialización

En el proceso de carga de clases anterior, excepto que la aplicación de usuario puede participar a través del cargador de clases personalizado durante la fase de carga, el resto de las acciones están completamente dominadas y controladas por la máquina virtual. Solo en la etapa de inicialización se ejecuta realmente el código del programa Java (o código de bytes) definido en la clase.

La fase de inicialización es el proceso de ejecución del método constructor de clase <clinit> ().

 

6. Cargador de clases

El equipo de diseño de la máquina virtual puso en práctica la acción de "obtener una secuencia de bytes binarios que describa esta clase a través del nombre completo de una clase" en la fase de carga de clases fuera de la máquina virtual Java, para que la aplicación pueda decidir cómo obtener todos Clase requerida El módulo de código que implementa esta acción se denomina "cargador de clases".

Para cualquier clase, es necesario establecer su unicidad en la máquina virtual Java mediante el cargador de clases que la carga y la clase misma. Cada cargador de clases tiene un espacio de nombres de clase independiente.

La clase "igual" incluye los resultados de retorno del método equals (), método isAssignableFrom (), método isInstance () del objeto Class que representa la clase, y también incluye el uso de la palabra clave instanceof para determinar la relación de propiedad del objeto.

6.1 Clasificación del cargador de clases:

Desde la perspectiva de la máquina virtual Java:

  • Cargador de clases de arranque (Bootstrap ClassLoader), este cargador de clases está implementado en lenguaje C ++ y es parte de la máquina virtual misma;
  • Todos los demás cargadores de clases, que se implementan en el lenguaje Java, son independientes del exterior de la máquina virtual y todos heredan de la clase abstracta java.lang.ClassLoader.

Desde la perspectiva de un desarrollador de Java:

  • Iniciar el cargador de clases (Bootstrap ClassLoader):
  • Extension ClassLoader (Extension ClassLoader):
  • Aplicación ClassLoader:

6.2 Modelo de delegación de padres

 

La relación jerárquica entre los cargadores de clases en la imagen anterior se denomina modelo de delegación principal del cargador de clases.

6.3 El proceso de trabajo del modelo de delegación principal:

Si un cargador de clases recibe una solicitud de carga de clases, no intentará cargar la clase por sí mismo, sino que delegará esta solicitud al cargador de clases padre para completarla. Esto es cierto para todos los niveles del cargador de clases, por lo que todos La solicitud de carga de eventualmente debe transferirse al cargador de clases de inicio de nivel superior. Solo cuando el cargador principal informa que no puede completar la solicitud de carga (la clase requerida no se encuentra en su ámbito de búsqueda), el cargador secundario lo intentará por sí mismo. Para cargar.

 

 

Descargo de responsabilidad: este artículo es una nota de estudio personal, el contenido proviene de "Conocimiento profundo de la máquina virtual Java · Características avanzadas y mejores prácticas de JVM" Zhou Zhiming y artículos de red

Supongo que te gusta

Origin www.cnblogs.com/xyzshm/p/12670841.html
Recomendado
Clasificación