深入理解java虚拟机之——类的加载过程

                                            深入理解JVM之——类加载过程

          在理解类加载之前先了解一下类加载器。顾名思义,类加载器就是将java字节码文件加载到JVM中,在虚拟机中,不同类加载器加载的类一定是不相同的,即使这两个类是一模一样的。举个例子,针对同一个类A,加载器1和加载器2加载A。在虚拟机的世界里,这两个加载器加载的“同一个类A”在虚拟机中是不同的,我们需要的是即使是不同的加载器加载同一个类,在虚拟机中也是同一个类,而事实上,虚拟机提供了一种机制来保证不同的类加载器加载同一个类得到的是同一个类对象,这种机制叫做类加载的“双亲委派模型”,如下图所示,所有的类都会委托给他的父类去加载,当父类加载不了的时候才会自己加载此类,这样就保证了相同的类都是被同一个类加载器加载,保证了同类的唯一性。从下面图可以看出,按层次可以划分为四类:启动类加载器、扩展类加载器、应用程序类加载器、自定义类加载器。按照虚拟类逻辑划分,分为两类:启动类加载器和其他类加载器。

                                 深入理解java虚拟机之——类的加载过程

    看完了类的加载器,下面进入正题,类的加载过程。先给出JVM类加载器加载类的整个流程图,下面解释每一个步骤。

           深入理解java虚拟机之——类的加载过程

加载:加载阶段是将java源码编译后的字节码文件进行加载,这个字节码文件可以是本地的、网络的、或者其他形式的字节码文件。

验证:验证阶段主要是对加载的字节码文件进行验证,看是否符合字节码文件,是否符合java虚拟机的标准,是否对虚拟机产生危害等等,如果上面不符合上述任何一个条件,则验证不通过,虚拟机加载器不会对其进行加载。

准备:该阶段主要为类的变量分配内存,并初始化为0值,注意这里仅仅是对类的变量进行内存分配并赋值,而不是实例变量的赋值。

解析:解析阶段是将虚拟机常量池中的引用转变为直接引用的过程。主要包括:类、接口、方法(类方法,接口方法)、字段的符号引用。

初始化:初始化阶段是开始执行程序员java构造代码。对静态变量和静态代码块进行初始化。

使用:类的使用

卸载:执行类的卸载,也就是类的垃圾回收。判断是否要进行类的卸载需要符合下面三种情况,缺一不可。

1.该类所有的实例都已经被回收,JVM中不存在任何该类的实例。

2.加载该类的类加载器已经被回收。

3.该类的java.lang.Class对象没有在任何地方被引用。