一、原理
JVM把class字节码文件加载到内存中,
将这些静态数据转换成方法区中的运行时数据结构,
在堆(并不一定在堆中,HotSpot在方法区中)中生成一个代表这个class的java.lang.class对象,作为方法区类数据的访问入口
二、加载机制
1.加载
通过类的全限定名来获取定义此类的二进制字节流
将这个类字节流代表的静态存储结构转为方法区的运行时数据结构
在堆中生成一个代表此类的java.lang.Class对象,作为访问方法区这些数据结构的入口
2.连接
校验:确保class文件的字节流包含的信息符合当前虚拟机的要求,
并且不会危害虚拟机的自身安全
文件格式验证:基于字节流验证
元数据验证:基于方法区的存储结构验证
字节码验证:基于方法区的存储结构验证
符号引用验证:基于方法区的存储结构验证
准备:为类变量分配内存,并将其初始化为默认值.即在方法区中分配这些变量所使用的内存空间
解析:把类型中的符号引用转换成直接引用
类或接口的解析
字段解析
类方法解析
接口方法解析
3.初始化
类初始化阶段是类加载过程中的最后一步,
前面的类加载过程中,
除了在加载阶段用户应用程序可以通过自定义类加载器参与之外,
其余动作完全是由虚拟机主导和控制的.
到了初始化阶段,
才真正开始执行类中定义的Java 程序代码