Carga de clase:
- El producto final de la carga de clase es un
Class
objeto ubicado en el montón Class
El 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:
- 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 - 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.Class
falta 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.
- El cargador que viene con la máquina virtual de Java
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
, elgoWork()
método de laCar
clase se llamará en el método de la claserun()
. Cuando la máquina virtual Java verifica laWorker
clase, verificará siCar
elrun()
método de la clase existe en el área del método . Si no existe (cuando la versión de laWorker
clase y laCar
clase son incompatibles, se producirá este problema yNoSuchMethodError
se 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 Simple
clase, en la etapa de preparación, al int
tipo de variable estática se le a
asigna 4
un byte de espacio de memoria y se le asigna un valor predeterminado 0
. Asigne un byte de espacio de memoria para long
una variable estática de tipo y asigne un valor predeterminadob
8
0
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 Car
clase están referenciados en los métodos de la clase run()
.
public void goWork(){
ca.run();//表示符号引用
}
En Worker
incluye 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.Car
run()
run()
Car
run()
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áticasa
yb
se inicializan explícitamente, peroc
no 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á ...