Java类加载流程

加载阶段

加载阶段是指通过完全限定名查找Class文件二进制数据并将其加载进内存的过程。大体流程会分为三步:

  • ①通过完全限定名查找定位.class文件,并获取其二进制字节流数据
  • ②把字节流所代表的静态存储结构转换为运行时数据结构
  • ③在堆中间中为其创建一个Class对象,作为程序访问这些数据的入口

链接阶段

"验证、准备、解析" 是 Java 类加载系统中 链接(Linking)阶段 的三个重要子阶段。


🧩 一、验证(Verification)

目标: 保证字节码文件(.class)的合法性与安全性,防止虚拟机被破坏。
作用: 检查类文件是否符合 JVM 规范,确认不会造成安全问题。

主要检查内容:

验证类型 检查内容 举例
文件格式验证 .class 文件结构是否正确 魔数、常量池、字段表是否符合规范
元数据验证 类的继承、实现关系是否合法 final 类不能被继承
字节码验证 指令逻辑是否安全 操作数栈不会越界、类型匹配正确
符号引用验证 常量池中引用是否有效 方法、字段是否存在且可访问

👉 通俗理解: 验证阶段就像机场安检,确保行李没问题(类文件没错)才能上飞机(进入 JVM 运行环境)。


⚙️ 二、准备(Preparation)

目标: 为类变量(static 修饰的变量)分配内存,并设置默认初始值。

此时还不会执行任何初始化代码或赋值语句

主要特点:

  • 只处理类变量(静态变量),实例变量不管。
  • 分配的内存位于方法区(JDK 8 后是元空间)。
  • 默认值初始化(例如 int → 0,boolean → false,reference → null)。

举例说明:

arduino 复制代码
public class Demo {
    static int a = 10;
    static final int b = 20;
}
  • 准备阶段
    a = 0 (分配内存并赋默认值)
    b = 20 (因为是编译期常量,直接赋值)

👉 通俗理解: 准备阶段就是 JVM 给静态变量"预留好房间",先放默认值进去,具体装修(赋值)在初始化阶段再做。


🔗 三、解析(Resolution)

目标: 把类中的符号引用(Symbolic Reference)转换为直接引用(Direct Reference)。

什么是符号引用?

符号引用是一种用字符串或索引描述目标的方式,比如:

  • 类名:java/lang/String
  • 字段:FieldRef #5
  • 方法:MethodRef #10

JVM 在解析阶段会根据这些符号引用,去查找实际的类、方法或字段在内存中的位置。

解析的几种类型:

  1. 类或接口解析

    • 把符号类名转换为对应的 Class 对象。
  2. 字段解析

    • 确定字段在内存布局中的具体位置。
  3. 方法解析

    • 确定具体的方法实现。
  4. 接口方法解析

    • 解析接口方法的具体实现(常见于动态绑定场景)。

👉 通俗理解: 解析阶段就像"联系人解析",把通讯录里的"张三"换成他的手机号(内存地址),方便 JVM 快速调用。


🧠 四、总结对比

阶段 主要任务 是否分配内存 是否执行代码 举例
验证(Verify) 检查类文件安全性 检查格式、继承关系、栈安全
准备(Prepare) 为静态变量分配内存并赋默认值 ✅ 是 static int a = 0
解析(Resolve) 将符号引用替换为直接引用 把"方法名"替换为实际地址

相关推荐
Pomelo_刘金1 分钟前
Rust 1.94.1 版本修复解析
后端·rust·编程语言
浪客川7 分钟前
【百例RUST - 015】闭包
开发语言·后端·rust
楼田莉子25 分钟前
仿muduo的高并发服务器——前置知识讲解和时间轮模块
服务器·开发语言·c++·后端·学习
小江的记录本26 分钟前
【分布式】分布式核心组件——分布式限流:固定窗口、滑动窗口、漏桶、令牌桶算法,网关层/服务层限流实现
java·分布式·后端·python·算法·安全·面试
Hanson,27 分钟前
SpringBoot前后端分离框架中,在请求头加入签名
java·spring boot·后端
九转成圣29 分钟前
Spring Boot 导出 Excel 最佳实践:从 POI 函数式封装到 EasyExcel 的“降维打击”
spring boot·后端·excel
liyi_hz200830 分钟前
O2OA(翱途) V10 升级说明(三)数据中心:精准查询·严谨权限·优质视图
后端·java-ee·开源软件
刀法如飞38 分钟前
一款基于 NestJS 的 DDD 脚手架,开箱即用
javascript·后端·架构
StackNoOverflow43 分钟前
SpringCloud 声明式服务调用 —— Feign 全面解析(入门 + 原理 + 优化)
后端·spring·spring cloud
fy121631 小时前
Spring Boot spring-boot-maven-plugin 参数配置详解
spring boot·后端·maven