Java类的加载过程

  1. 加载(Loading)

    • 这是类加载过程的第一个阶段。在这个阶段,Java 虚拟机(JVM)找到并读取类的二进制数据,通常是 .class 文件。这些数据从文件系统、网络、zip 包、jar 文件或其他形式的二进制数据源中获取。
    • 加载完成后,类的二进制数据被转换为方法区内的运行时数据结构,并在堆内存中创建一个代表这个类的 java.lang.Class 实例。这个 Class 对象作为方法区中类数据的访问入口。
  2. 验证(Verification)

    • 验证阶段确保加载的类信息符合 JVM 的规范要求,不会危害虚拟机自身的安全。验证包括文件格式验证、元数据验证、字节码验证和符号引用验证等多个阶段,目的是确保类文件的结构正确并且没有恶意代码。
  3. 准备(Preparation)

    • 准备阶段为类的静态变量分配内存,并为其设置初始默认值。比如,对于整型 static int i = 10;,在这个阶段 i 会被赋值为 0,而不是 10,初始化的值将在初始化阶段设定。
    • 这个阶段不会执行任何 Java 代码,只是为类变量分配内存并设置初始值。
  4. 解析(Resolution)

    • 解析阶段将常量池中的符号引用(如类名、方法名等)替换为直接引用的过程。直接引用可以是直接指向目标的指针、相对偏移量或能间接定位到目标的句柄。解析动作可以推迟到首次使用该符号引用时才进行。
  5. 初始化(Initialization)

    • 到了初始化阶段,JVM 执行类的构造器 <clinit> 方法,为类的静态变量赋予正确的初始化值。这个方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static {} 块)中的语句合并产生的。
    • 初始化阶段是类加载过程的最后一步,之后类就可以被 JVM 正常使用了。注意,类的初始化仅在主动使用时触发,这包括创建类的实例、访问类的静态变量或静态方法、反射操作类、初始化子类、JVM 启动时标明的启动类等场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Addison_Wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值