1、加载
构建类的字节码对象,类型为Class类型。将class字节码文件加载到内存中,并将这些数据转换成方法区中的运行时数据(静态变量、静态代码块、常量池等),在堆中生成一个class对象代表这个类,作为方法区类数的访问入口。
2、连接
将Java类的二进制代码合并到JVM的运行状态之中。
2.1 验证
检查类加载信息是否符合JVM规范,无安全方面的问题。
检查文件格式、元数据、字节码、符号引用验证。
2.2 准备
可能会初始化类中的静态变量(类变量),也可能会执行类中的静态代码块(具体是否执行由加载方式决定)。
为类的静态变量分配内存,并将其初始化默认值。
2.3 解析
虚拟机常量池内的符号引用替换为直接引用的过程。
3、初始化
执行类构造器的<clinit>()方法。(由类加载器负责将类加载到内存中)。
为类的静态变量赋予正确的初始值。
Java程序初始化顺序:
1、父类的静态变量
2、父类的静态代码块
3、子类的静态变量
4、子类的静态代码块
5、父类的非静态变量
6、父类的非静态代码块
7、父类的构造方法
8、子类的非静态变量
9、子类的非静态代码块
10、子类的构造方法
详细类加载代理模式(双亲委派机制模型)参考:https://www.jianshu.com/p/dd39654231e0