类的加载过程
-
装载
所谓装载,就是将Java类的字节码文件加载到机器内存中,并在内存中构建出Java类的原型(类模板对象)
在这个阶段,Java虚拟机必须完成以下3个事情:
- 通过类的全限定名,获取类的二进制数据流
- 解析类的二进制数据流为方法区内的数据结构
- 创建java.lang.Class类的实例(堆中),作为方法区这个类的各种数据的访问入口
PS:数组类本身不是由类加载器负责创建,而是由JVM在运行时根据需要而直接创建的,但是数组的元素类型仍然需要依靠类加载器去创建。
-
链接
-
验证
它的目的保证加载的字节码是合法,合理且符合JVM规范的。包含格式检查、语义检查、字节码检查、引用符号检查。
-
准备
为类的静态变量分配内存,并将其初始化为默认值。在这个阶段,虚拟机就会为这个类分配相应的内存空间,并设置默认初始值。Java虚拟机为各类型变量赋默认的初始值如下表所示:
类型 默认初始值 byte (byte)0 short (short)0 int 0 long 0L float 0.0f double 0.0 char \u0000 boolean false reference null 注意:Java并不支持boolean类型,对于boolean类型,内部实现是int,由于int的默认值是0,所以boolean的默认值是false;这里不包含基本数据类型的字段用static final修饰的情况,因为final在编译的时候就分配了,准备阶段会显式赋值;
-
解析
将类、接口和方法的符号引用(字面量描述)转为直接引用(内存地址)。在HotSpot JVM中加载、验证、准备和初始化会按照顺序有条不紊地执行,但链接阶段的解析操作往往会在执行完初始化之后再执行。
-
-
初始化
为类的静态变量赋予正确的初始值。执行初始化方法(<clint>()方法)该方法由类静态成员的赋值语句和静态代码块合并而来。一个类在使用之前必须进行初始化,这里的使用指的是主动使用。
-
使用
略
-
卸载
Class对象和ClassLoader对象都要卸载,所以一般与JVM关闭时一同卸载。
类的加载器
Bootstrap ClassLoader(引导类加载器), Extension ClassLoader(扩展类加载器), Application ClassLoader(应用类加载器)
类加载机制:双亲委派机制。