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

  • 自定义

双亲委派作用:

  • 防止核心类被篡改

  • 保证类唯一性

相关推荐
Joe_Wang518 分钟前
【从0到1学习JVM · 25】同样都要停顿所有线程,Parallel比Serial到底强在哪
java·jvm·学习·垃圾回收
wuminyu19 分钟前
JVM虚拟线程的底层实现原理分析
java·linux·c语言·jvm·c++
wuminyu12 小时前
C++协程实现接收端的零拷贝Buffer管理原理剖析
java·linux·c语言·jvm·c++
波力海苔夹心脆67515 小时前
C# 值类型与引用类型详解:存储位置、赋值机制、参数传递、相等比较、装箱拆箱与常见陷阱
开发语言·jvm·经验分享·笔记·c#·.net
Joe_Wang517 小时前
【从0到1学习JVM · 15】对象在堆里来回倒腾,究竟怎样才会进老年代?
java·jvm·学习·垃圾回收
小宋102119 小时前
SQL + RAG 混合问答实战:结构化指标与文档证据如何统一路由
java·jvm·人工智能·sql
Joe_Wang519 小时前
【从0到1学习JVM · 13】点进JDK源码只有一个分号?搞懂本地方法栈与JNI机制
java·jvm·学习·本地方法栈
今天的砖头有点烫手啊20 小时前
Java IO/NIO/AIO 演进:从 BIO 到 Netty 的底层逻辑
java·jvm·nio
晚安code21 小时前
JVM 内存结构入门:程序计数器、虚拟机栈、本地方法栈与堆的溢出诊断
java·jvm
老三牛擦1 天前
多平台上架
jvm