【JVM】类加载过程

类的生命周期

简单概括共有 7 个阶段:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、卸载(Unloading)。其中,验证、准备和解析这三个阶段可以统称为连接(Linking)。

类加载过程

Class 文件需要加载到虚拟机中才能运行和使用,加载 Class 文件需要三步:加载、链接、初始化,其中链接又分为验证、准备、解析。

加载

加载主要是通过类加载器(ClassLoader)完成的。类加载器有很多种,当我们想要加载一个类的时候,具体是哪个类加载器加载由双亲委派模型决定(不过,我们也能打破由双亲委派模型)。

数组是个个例, 数组类不是通过 ClassLoader 创建的,而是 JVM 在需要的时候自动创建的,数组类通过getClassLoader()方法获取 ClassLoader 的时候和该数组的元素类型的 ClassLoader 是一致的。

验证

验证是连接阶段的第一步,这一阶段的目的是确保 Class 文件的字节流中包含的信息符合《Java 虚拟机规范》的全部约束要求,保证这些信息被当作代码运行后不会危害虚拟机自身的安全。

准备

准备阶段是正式为类变量分配内存并设置类变量初始值的阶段

注意:

  1. 这时内存分配仅分配静态变量,即 static 关键字修饰的变量,实例变量并不会分配
  2. 这里所设置的初始值"通常情况"下是数据类型默认的零值(如 0、0L、null、false 等),比如我们定义了public static int value=111 ,那么 value 变量在准备阶段的初始值就是 0 而不是 111(初始化阶段才会赋值)。特殊情况:比如给 value 变量加上了 final 关键字public static final int value = 111 ,那么准备阶段 value 的值就被赋值为 111。

解析

解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程

初始化

初始化阶段是执行初始化方法 < clinit > ()方法的过程,是类加载的最后一步,这一步 JVM 才开始真正执行类中定义的 Java 程序代码(字节码)。

类卸载

卸载意味着此类也就被 GC(垃圾回收)了。

卸载满足的三个条件:

  1. 堆中没有该对象实例
  2. 该类没有在任何地方被引用
  3. 该类的类加载器已经被 GC

参考链接

https://javaguide.cn/java/jvm/class-loading-process.html

相关推荐
宋哥转AI4 分钟前
@Tool写了但tools/list为空?Spring AI MCP Server注册的两种路径和四个坑
java·agent·mcp
兰令水27 分钟前
leecodecode【树形DP】【2026.6.11打卡-java版本】
java·算法·深度优先
骑士雄师33 分钟前
19.3 langgraph的工作节点和路由函数
java·前端·数据库
SWAGGY..1 小时前
Linux系统编程:(十三)环境变量
java·linux·算法
程序员黑豆1 小时前
AI全栈开发 - Java:基本数据类型 vs 引用数据类型的内存存储
java·前端·ai编程
布朗克1681 小时前
34 JVM深入理解
java·jvm
Flittly1 小时前
【AgentScope Java新手村系列】(4)结构化输出
java·spring boot·spring·ai
何以解忧,唯有..2 小时前
Python 中的继承机制:从基础到高级用法详解
java·开发语言·python
Yiyaoshujuku2 小时前
化合物数据集API接口(数据结构及样例)
java·网络·数据结构
plainGeekDev2 小时前
算法刷题笔记:一维DP没那么难,状态想清楚就赢了一半
java·算法·面试