JVM 类加载的过程&类加载器&双亲委派机制

Java 类加载过程分为:加载 → 验证 → 准备 → 解析 → 初始化,其中前四步称为"连接(Linking)"。

文章目录

一、每一步JVM都在做什么?

1. 加载(Loading)------ 把字节码"搬进 JVM"

JVM 做的事:

  • 根据类的全限定名

  • 找到 .class 文件

  • 读入方法区(元空间)

  • 创建 Class 对象

来源可能是:

  • 本地 class 文件

  • jar 包

  • 网络

  • 动态生成(代理类)

⚠️ 这一步 还没执行任何 Java 代码


2. 验证(Verification)------ JVM 的"安检门"

目的:保证字节码是合法、安全的

主要验证内容:

  • 文件格式验证

  • 元数据验证

  • 字节码验证

  • 符号引用验证

如果失败:

java 复制代码
java.lang.VerifyError

3. 准备(Preparation)------ 给"类变量"分配空间

关键点(高频考):

  • 只给 static 变量 分配内存

  • 默认值

java 复制代码
static int a = 10;

准备阶段结果:

java 复制代码
a = 0

4.解析(Resolution)------ 把"符号引用"变成"直接引用"

  • 常量池里的符号引用

  • 转成内存地址

比如:

  • 方法

  • 字段

⚠️ 有些 JVM 会 延迟到真正使用时才解析


5. 初始化(Initialization)------ 真正执行 Java 代码

这是 唯一会执行 Java 代码的阶段

做的事:

  • 执行 <clinit> 方法

    • static 变量显式赋值

    • static 代码块

示例:

java 复制代码
static int a = 10;
static {
    a = 20;
}

初始化后:

java 复制代码
a = 20

二、类什么时候会被初始化?

会触发初始化的场景:

  1. new 对象

  2. 访问静态变量(非 final)

  3. 调用静态方法

  4. 反射

  5. 初始化子类,父类先初始化

  6. JVM 启动时的主类


不会触发初始化的场景(陷阱)

java 复制代码
public static final int A = 10;
  • 编译期常量

  • 不会触发类初始化


三、 父子类加载顺序(常考)

java 复制代码
class Parent {
    static {
        System.out.println("Parent");
    }
}

class Child extends Parent {
    static {
        System.out.println("Child");
    }
}
java 复制代码
new Child();

输出:

复制代码
Parent
Child

规则:

先父后子,静态优先


四、类加载器和双亲委派机制

虽然不是"过程的一步",但几乎必追。

类加载器层级:

  • Bootstrap

  • Extension

  • Application

  • 自定义

双亲委派作用:

  • 防止核心类被篡改

  • 保证类唯一性

相关推荐
wear工程师1 天前
Java 类初始化到底何时触发?别把加载、连接和 static 执行混在一起
java·jvm
程序员雷欧1 天前
线上频繁触发各种 GC 的原因排查与处理指南
java·jvm·算法
wuminyu2 天前
JVM利用io_uring优化堆外内存性能原理剖析
java·linux·c语言·jvm·c++
147API3 天前
Python批量生成蒸馏数据,并发、重试、幂等和断点续跑
开发语言·jvm·python
wuminyu3 天前
JDK21解决虚拟线程IO阻塞原理剖析
java·linux·c语言·jvm·c++
sunywz3 天前
【JVM】(8)JVM调优实战及常量池详解
jvm
wuminyu4 天前
虚拟线程底层ForkJoinPool的工作窃取算法机制
java·linux·c语言·jvm·c++
leisoo80974 天前
股票数据本地化存储实战:JSON、数据库与列式存储的方案对比
jvm·数据库·json
SamChan904 天前
PDF翻译中的并发控制:用Semaphore防止API限流与资源耗尽
java·jvm·pdf
snow@li4 天前
Java:跨平台原理与JDK、JRE、JVM全景深度解析
java·开发语言·jvm