【JVM虚拟机篇08】类装载的执行过程

24 阅读2分钟

类从加载到虚拟机中开始,直到被卸载为止,整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载。

验证、准备、解析 ---- 连接(linking)

加载

  • 通过类的全名,获取类的二进制数据流
  • 解析类的二进制数据流为方法区的数据结构(java 类模型)
  • 创建java.lang.Class类实例,表示该类型,作为方法区这个类的各种数据的访问入口

image.png

验证(是否符合JVM规范,安全性检查)

  • 文件格式验证
  • 元数据验证
  • 字节码验证
  • 符号引用验证

格式检查(文件格式、元数据、字节码):文件格式是否错误、语法是否错误、字节码是否合规

符号引用验证:Class文件在其常量池会通过字符串记录自己将要使用的其他类或者方法,检查它们是否存在

准备(为类变量分配内存并设置类变量初始值)

  • static变量,分配空间在准备阶段完成(设置默认值)【初始化阶段赋值】
  • static变量是final的基本类型,以及字符串常量,值已经确定,赋值在准备阶段
  • static变量是final的引用类型,设置默认值null,【初始化阶段赋值】

解析

把类中的符号引用转为直接引用

比如:方法中调用了其他方法,方法名可以理解为符号引用,而直接引用就是使用指针指向方法

image.png

初始化

对类的静态变量,静态代码块执行初始化操作

  • 如果初始化一个类的时候,其父类尚未初始化,则优先初始化父类
  • 如果同时包含多个静态变量和静态代码块,则按照自上而下的顺序依次执行

使用

JVM开始从入口方法开始执行用户的代码

  • 调用静态类成员(静态字段、静态方法)
  • 使用new 关键字为其创建对象实例