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

  • 自定义

双亲委派作用:

  • 防止核心类被篡改

  • 保证类唯一性

相关推荐
HwJack2015 小时前
Flask+SQLite简易后端数据存储实现原理
jvm·sqlite·flask
Dicky-_-zhang15 小时前
Redis集群模式详解与实战配置
java·jvm
Kiling_070415 小时前
面向对象和集合编程题 ( 一 )
jvm·windows
上弦月-编程16 小时前
Java类与对象:编程核心解密
java·开发语言·jvm
Dicky-_-zhang16 小时前
线上故障排查与应急响应实战:从零开始建立你的SRE体系
java·jvm
大大杰哥16 小时前
从 Volatile 到 ThreadLocal:Java 线程安全机制备忘
java·开发语言·jvm
AI人工智能+电脑小能手16 小时前
【大白话说Java面试题 第67题】【JVM篇】第27题:生产环境服务器变慢,诊断思路和性能评估谈谈?
java·服务器·jvm·面试
Dicky-_-zhang16 小时前
服务网格Istio mTLS配置实战
java·jvm
Dicky-_-zhang17 小时前
服务网格实战:Istio与Linkerd对比选型与落地实践
java·jvm
存在的五月雨17 小时前
JVM 入门学习笔记(内存模型 / GC / 类加载机制)
jvm·笔记·学习