¿Qué es la clase de carga

 

En primer lugar, ¿cuál es la clase cargada

archivo Java en un archivo .class a través del compilador, a continuación, gire las cargas cargador de clases del archivo .class en la JVM. Incluyendo el papel del cargador de clases es en realidad clase cargada.

De hecho, el cargador de clases no tiene que esperar a que una clase que volver a cargar cuando está "activamente utilizado por primera vez", la especificación JVM permite un cargador de clases cuando se espera que una clase que se utilizará, es pre-cargado con él, si en el curso de pre-cargado en archivo Met .class falta o hay un error, el cargador de clases cuando la clase primero debe tomar la iniciativa de utilizar el informe de error (error LinkageError) en el programa si la clase no ha estado usando activamente el programa, el cargador de clases no informar de un error.

 

En segundo lugar, el proceso de carga de clases

Las clases comienzan a ser cargado en la memoria de la máquina virtual, hasta descargar una memoria, la totalidad de su ciclo de vida, incluyendo: carga, validación, preparación, análisis sintáctico, la inicialización, uso y desinstalación de siete etapas. Su orden como se muestra a continuación:

proceso de carga de clases que incluye la carga, validación, preparación, analítico, la inicialización de cinco etapas. En estas cinco etapas, carga, validación, preparación e inicializar estas cuatro etapas es determinar el orden de aparición, y el escenario no es necesariamente soluciona, se puede iniciar después de la fase de inicialización en algunos casos. También tenga en cuenta que hay varias etapas de la secuencia de arranque, en lugar de completa o secuencialmente, debido a que estas etapas son generalmente se cruzan entre sí mezclando normalmente llamar o activar una fase en otra etapa durante la ejecución.

 

1, Load

"Carga" es el primer proceso de "clase y mecanismo", los .class lee desde el disco en la memoria, la máquina virtual es tres cosas:

(1) para obtener su nombre completo definido por una clase de flujo de bytes binaria

(2) el flujo de bytes que representa la estructura de almacenamiento estático en un método de área de estructura de datos en tiempo de ejecución

(3) un representante de esta clase de objeto de clase generados en la pila, como la entrada método de acceso en el área de datos.

En relación con otras fases de la carga de clases, la fase de carga es la etapa más controlable, porque los programadores pueden utilizar el cargador de clases del sistema, también puede utilizar su propio cargador de clases. Introducimos la clase Loader se detalla en la parte final. Aquí sólo necesitamos saber el papel del cargador de clases está por encima de la máquina virtual de tres cosas se deben hacer, eso es todo muy bien.

 

2, la verificación

El papel principal de la verificación es asegurar la exactitud de la clase cargada. El primer paso es la etapa de la conexión. Para decirlo claramente es, no podemos cargar el archivo .class buena peligrosos para nuestra máquina virtual, por lo que la primera prueba a prueba. Él es la realización de la verificación de cuatro etapas:

Verificación (1) Formato de archivo: flujo de bytes del archivo .class para verificar si las especificaciones del formato de archivo de clase, y puede ser una versión actual de procesamiento de la máquina virtual. Esto se debe principalmente dentro del número mágico, el número de versión principal, y similares piscina cheque constante (número mágico, el número de versión principal es .class archivo contiene los datos, cuando no se pueden entender).

(2) verificación de metadatos: información se describe principalmente bytecode análisis semántico para asegurarse de que cumple los requisitos de Java Specification lenguaje de descripción, por ejemplo, para verificar esta clase no es una clase padre, el método de campo clase es y no el conflicto de clases de padres y así sucesivamente.

(3) de código de bytes de verificación: Este es el más complejo de toda la etapa de proceso de verificación, principalmente a través de los datos de flujo y análisis de flujo de control para determinar la semántica del programa es legítimo, lógico. Después de hacer la verificación de los tipos de datos en la fase de validación de metadatos, que principalmente hace que el análisis de los métodos de la clase, método de clase no garantiza para hacer las cosas máquinas virtuales seguras Weihai en tiempo de ejecución.

(4) la verificación de referencias simbólicas: es la última etapa de la verificación se llevó a cabo en la máquina virtual en una referencia simbólica cuando se hace referencia directamente. Basado principalmente en la información diferente de sí mismo ser verificado. El propósito es asegurar que la operación de análisis se puede completar.

 

3, listo

variables de clase fase de preparación asignan memoria y establecer el valor inicial de la principal es. La memoria se asigna en el área de método. En esta etapa, sólo tenemos que prestar atención a dos cosas muy bien, es decir, las variables de clase y el valor inicial de las dos palabras clave:

se está asignando (1) de clase variable de memoria (estático), pero no variables de instancia, variables de instancia instancia como un objeto principal se asigna a la java montón,

(2) cuando el valor inicial se refiere al valor predeterminado tipo de datos se muestra en lugar dado código. tal como

int valor public static = 1; // donde después el valor de fase de preparación es 0, en lugar de 1. Asignada a la acción 1 en la fase de inicialización. FIG otros valores predeterminados

Tenga en cuenta que es 0, pero si al mismo tiempo ser modificado después de la fase de preparación final y estático es un 1 en el valor anterior está siendo modificado etapa estática después de la preparación. Podemos ser entendida como resultados finales serán puestos estáticos de su clase para llamar al compilador de la piscina constante

 

4, el análisis sintáctico

解析阶段主要是虚拟机将常量池中的符号引用转化为直接引用的过程。什么是符号应用和直接引用?

符号引用:以一组符号来描述所引用的目标,可以是任何形式的字面量,只要是能无歧义的定位到目标就好,就好比在班级中,老师可以用张三来代表你,也可以用你的学号来代表你,但无论任何方式这些都只是一个代号(符号),这个代号指向你(符号引用)

直接引用:直接引用是可以指向目标的指针、相对偏移量或者是一个能直接或间接定位到目标的句柄。和虚拟机实现的内存有关,不同的虚拟机直接引用一般不同。解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符7类符号引用进行。

 

5、初始化

这是类加载机制的最后一步,在这个阶段,java程序代码才开始真正执行。我们知道,在准备阶段已经为类变量赋过一次值。在初始化阶端,程序员可以根据自己的需求来赋值了。一句话描述这个阶段就是执行类构造器< clinit >()方法的过程。

在初始化阶段,主要为类的静态变量赋予正确的初始值,JVM负责对类进行初始化,主要对类变量进行初始化。在Java中对类变量进行初始值设定有两种方式:

①声明类变量是指定初始值

②使用静态代码块为类变量指定初始值

JVM初始化步骤

1、假如这个类还没有被加载和连接,则程序先加载并连接该类

2、假如该类的直接父类还没有被初始化,则先初始化其直接父类

3、假如类中有初始化语句,则系统依次执行这些初始化语句

类初始化时机:只有当对类的主动使用的时候才会导致类的初始化,类的主动使用包括以下六种:

创建类的实例,也就是new的方式访问某个类或接口的静态变量,或者对该静态变量赋值调用类的静态方法反射(如 Class.forName(“com.shengsiyuan.Test”))初始化某个类的子类,则其父类也会被初始化Java虚拟机启动时被标明为启动类的类( JavaTest),直接使用 java.exe命令来运行某个主类好了,到目前为止就是类加载机制的整个过程,但是还有一个重要的概念,那就是类加载器。在加载阶段其实我们提到过类加载器,说是在后面详细说,在这就好好地介绍一下类加载器。

 

 

三、类加载器

虚拟机设计团队把加载动作放到JVM外部实现,以便让应用程序决定如何获取所需的类。

 

可通过编写Java代码去获得这个三个加载器分别加载的文件

System.getProperty("sun.boot.class.path").split(";");//根加载器

System.getProperty("java.ext.dirs").split(";");//拓展类加载器

System.getProperty("java.class.path").split(";");//应用类加载器

 

 

 

 

 

 

 

 

发布了4 篇原创文章 · 获赞 0 · 访问量 29

Supongo que te gusta

Origin blog.csdn.net/a970066364/article/details/104737022
Recomendado
Clasificación