【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

相关推荐
边境悍匪1 分钟前
蜗牛学苑 Java 智能体学习 Day49|贯穿项目 5 订单下单业务 思维导图复盘
java·开发语言·spring boot·学习·阿里云
鬼手点金4 分钟前
Claude Code示范案例-修复 Bug 工作流
java·服务器·前端·javascript·bug·openclaw
一条破秋裤5 分钟前
Linux 进程通信介绍:内存隔离与 IPC 分类
java·linux·服务器
机核研创社16 分钟前
polo 长袖短裤套装自动化产线:八台机器排队接力
android·java·自动化
Roadinforest28 分钟前
Spring Boot 4 六步入门实录:从 Hello World 到一个能交付的 Todo API
java·开发语言·spring boot·spring
半仙白桑28 分钟前
内核篇第十三讲:system-V消息队列
java·linux·网络
今天的砖头有点烫手啊34 分钟前
GC 算法与垃圾收集器演进:从 Serial 到 ZGC
java·jvm
牧瀬クリスだ1 小时前
Mybatis-Plus:让CRUD快如闪电
java·spring boot·spring·tomcat·mybatis·yml
johnny2331 小时前
JVM生态下Web开发框架:SparkJava、Javalin、Micronaut、SparkKotlin
jvm
盐焗鹌鹑蛋1 小时前
【Linux】线程概念和控制
java·linux·服务器