12.JVM-类加载生命周期

发布时间:2026/6/14 9:16:15

12.JVM-类加载生命周期 JVM 类加载生命周期包含 7 个阶段加载、验证、准备、解析、初始化、使用、卸载。其中验证、准备、解析统称为连接。加载加载是类加载过程的第一个阶段虚拟机需完成以下动作获取二进制字节流通过类的全限定名定位并读取类的二进制数据来源可以是 .class 文件、ZIP/JAR包、网络、动态生成等。静态存储结构转换将字节流代表的静态存储结构转化为方法区元空间的运行时数据结构。生成 Class 对象在内存中HotSpot 虚拟机存放在堆中实例化一个 java.lang.Class对象作为程序访问方法区中该类数据的外部接口。验证验证是连接阶段的第一步目的是确保二进制字节流符合虚拟机规范防止恶意代码危害 JVM 安全。文件格式验证检查魔数Magic Number、主次版本号、常量池类型等是否符合规范。元数据验证对字节码进行语义分析检查是否有父类、是否继承了不允许被继承的类如 final类、是否实现了接口的所有方法等。字节码验证通过数据流和控制流分析确保程序语义是合法、符合逻辑的如操作数栈的数据类型与指令代码序列配合工作。符号引用验证在解析阶段发生确保符号引用能转换为直接引用如通过全限定名是否能找到对应的类、方法、字段。准备准备阶段是正式为类变量即 static 修饰的变量分配内存并设置初始值的阶段。内存分配在方法区元空间中进行。初始值设定此处指数据类型的“零值”如 int 为 0boolean 为 false引用类型为null而非逻辑上的赋值。特殊情况若变量被 final static 修饰常量则在此阶段会直接按照字段属性表中的 ConstantValue属性进行显式赋值。解析解析是将常量池内的符号引用替换为直接引用的过程。符号引用以一组符号来描述所引用的目标与内存布局无关。直接引用直接指向目标的指针、相对偏移量或能间接定位到目标的句柄。解析对象主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符。初始化初始化是类加载过程的最后一步也是执行类中定义的 Java 程序代码字节码的开始。执行 clinit() 方法该方法由编译器自动收集类中所有类变量的赋值动作和静态语句块static{}中的语句合并而成。执行顺序虚拟机会保证父类的 clinit() 方法在子类执行前已完成。同步性虚拟机会保证一个类的 clinit() 方法在多线程环境下被正确地加锁和同步。使用类被初始化后开发人员可以在程序中使用该类。实例化创建类的实例对象。访问调用类的方法或访问类的字段。卸载当类不再被使用时类的数据会从内存中移除。卸载需满足以下三个严苛条件该类所有的实例都已被回收堆中不存在该类的任何实例。加载该类的 ClassLoader 已被回收。该类对应的 java.lang.Class 对象没有在任何地方被引用且无法在任何地方通过反射访问该类x的方法。

相关新闻