类从加载到虚拟机中开始,直到卸载为止,它的整个生命周期包括了:加载、验证、准备、解析、初始化、使用和卸载这7个阶段。其中,验证、准备和解析这三个部分统称为连接(linking)
❒ 加载
✔ 通过类的全名,获取类的二进制数据流。
✔ 解析类的二进制数据流为方法区内的数据结构(Java类模型)
✔ 创建java.lang.Class类的实例,表示该类型。作为方法区这个类的各种数据的访问入口
❒ 验证
✔ 文件格式验证
✔ 元数据验证
✔ 字节码验证
✔ 符号引用验证:Class文件在其常量池会通过字符串记录自己将要使用的其他类或者方法,检查它们是否存在
❒ 准备
✔ static变量,分配空间在准备阶段完成(设置默认值),赋值在初始化阶段完成
✔ static变量是final的基本类型,以及字符串常量,值已确定,赋值在准备阶段完成
✔ static变量是final的引用类型,那么赋值也会在初始化阶段完成
❒ 解析
✔ 把类中的符号引用转换为直接引用
✔ 比如:方法中调用了其他方法,方法名可以理解为符号引用,而直接引用就是使用指针直接指向方法
❒ 初始化
✔ 如果初始化一个类的时候,其父类尚未初始化,则优先初始化其父类。
✔ 如果同时包含多个静态变量和静态代码块,则按照自上而下的顺序依次执行。
❒ 使用
JVM 开始从入口方法开始执行用户的程序代码
✔ 调用静态类成员信息(比如:静态字段、静态方法)
✔ 使用new关键字为其创建对象实例
❒ 卸载