从“类加载的五个阶段”逐步分析 JVM“ 在每个阶段的内存变化”

下面从 类加载的五个阶段 逐步分析 JVM 在每个阶段的内存变化

(以 HotSpot + Java17 为例,Java8 以后方法区已改为 Metaspace)


JVM 相关内存区域速览

区域 作用 是否线程共享
堆(Heap) 对象实例、数组 共享
方法区 / 元空间 (Metaspace) 类的元信息、静态变量、常量池、JIT 代码 共享
运行时常量池 字面量、符号引用 共享
栈 (Java Stack) 局部变量、操作数栈、方法帧 线程私有
程序计数器 当前字节码行号 线程私有

类加载生命周期与内存变化

1️⃣ 加载 (Loading)

做的事

  • 通过 ClassLoader 读取 .class 字节码,形成 Class 对象。

内存变化

  • Metaspace:分配空间存放类的结构信息(字段、方法表、字节码指令)。
  • 运行时常量池:复制 class 文件中的常量池(符号引用、字符串字面量等)。
  • 堆/栈:暂时无变化。

2️⃣ 验证 (Verification)

做的事

  • 校验字节码格式、安全性(魔数、常量池索引、数据流、控制流)。

内存变化

  • Metaspace 中的类结构已存在,只进行一致性检查,没有额外分配大量内存。

3️⃣ 准备 (Preparation)

做的事

  • 为类的静态变量分配内存并设默认值(int=0、reference=null 等)。

内存变化

  • Metaspace

    • 分配静态变量所需空间,存储在类元数据区域。
    • 如果是 static final 且编译期常量,值直接存入运行时常量池。
  • 堆:此时不会创建对象实例。


4️⃣ 解析 (Resolution)

做的事

  • 把运行时常量池中的符号引用解析成直接引用(内存地址或句柄)。

内存变化

  • 运行时常量池中保存的直接引用指针被填充。
  • 可能触发其他类的加载/初始化,间接扩展 Metaspace 占用。

5️⃣ 初始化 (Initialization)

做的事

  • 执行 <clinit>:静态变量显式赋值、静态代码块。

内存变化

  • Metaspace:静态变量值被正式写入。

    • 如果静态变量是对象或集合,此时会在堆上创建对象实例并把引用放到 Metaspace 静态变量表。
  • :执行 <clinit> 方法帧入栈,执行完后出栈。


运行时继续变化

  • 实例化对象 → 在堆上分配实例内存。
  • 类卸载(ClassLoader 不再被引用)→ 其在 Metaspace 中的元数据、静态变量会被 GC 回收。

简化时序图

复制代码
Class 文件
   │
   ▼
[加载] ──► Metaspace: 类结构、常量池
   │
[验证] ──► 仅检查,无大变化
   │
[准备] ──► Metaspace: 静态变量默认值
   │
[解析] ──► 常量池符号引用 → 直接引用
   │
[初始化] ──► Metaspace: 赋真实值
   │          Heap: 静态对象实例

小结

  • 类元信息 + 静态变量存放在 Metaspace
  • 实例对象在 Heap
  • 执行方法时用栈
  • 类加载阶段的内存主要变化是 Metaspace 的增长 ,初始化阶段可能会触发 Heap 分配
相关推荐
Tingjct20 小时前
线程详细讲解---聚焦linux
linux·服务器·jvm
myy-learn20 小时前
32 SQLITE数据库
jvm·数据库·sqlite
wuminyu1 天前
JVM锁膨胀与Futex源码解析
java·linux·c语言·jvm·c++
郝学胜-神的一滴1 天前
C++11 工程级应用 08:Lambda表达式与Tuple元组
开发语言·jvm·c++·python·程序人生·开源
袋鼠云数栈2 天前
整库迁移与分库分表同步:批量数据搬迁的配置简化思路
jvm·数据库·oracle
Mr. zhihao2 天前
JVM 偏向锁 4 秒延迟:从源码动机到 JEP-374 废弃全链路
jvm·并发·偏向锁
孙克旭_2 天前
JVM 入门详解:JVM、JRE、JDK 区别,JVM 基础结构梳理
java·开发语言·jvm
随遇而安zx2 天前
【地基篇】---JVM 内存结构知识点(Java 8 运行时数据区深度解析)
java·开发语言·jvm
恒拓高科WorkPlus2 天前
企业如何搭建安全内部通讯平台|企业内部通讯平台怎么选才更安全?
jvm·数据库·安全
随遇而安zx2 天前
【地基篇】---JVM 类加载 源码解析(基于 Java 8)
java·jvm·python