加载、连接(验证 准备 解析)、初始化阶段
- 加载:根据类的全限定名来获取此类的二进制字节流;将这个字节流代表的静态存储结构转化为方法区中的动态存储结构;在内存中生成一个代表这个类的java.lang.Class对象,作为方法区中这个类的访问入口。
- 验证(连接):确保加载的类信息符合jvm规范,无安全方面的问题
- 准备(连接):为类变量分配内存并设置初始值,分配的内存在方法区中
- 解析(连接):将常量池中的符号引用转化为直接引用的过程
- 初始化:初始化阶段是执行类构造器clinit()方法的过程。该方法是由编译器自动收集类中所有类变量的赋值动作和静态语句块合并产生。且保证子类的clinit调用之前会先调用父类的clinit方法。接口除外,如果一个类实现了接口,在执行该类的clinit方法,就不会执行接口的clinit方法。因为clinit方法可以不存在,比如接口没有静态语句块和类变量。