【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

相关推荐
2401_883600251 分钟前
CSS 背景图片无法加载的常见原因与正确写法详解
jvm·数据库·python
Huangxy__3 分钟前
java相机手搓(后续是文件保存以及接入大模型)
java·开发语言·数码相机
qq_189807035 分钟前
mysql如何快速判断两个数据库结构差异_使用mysqldiff工具
jvm·数据库·python
qq_654366986 分钟前
SQL如何优雅地进行多表关联查询_掌握JOIN语法执行逻辑
jvm·数据库·python
HHHHH1010HHHHH7 分钟前
如何强制phpMyAdmin通过HTTPS安全访问_配置ForceSSL参数与Web代理端证书部署
jvm·数据库·python
解救女汉子7 分钟前
如何在Python中正确使用MongoDB事务
jvm·数据库·python
2301_814809868 分钟前
Layui表单提交时如何防止用户重复点击提交按钮
jvm·数据库·python
qq_4138474011 分钟前
SQL连接查询中处理NULL值的技巧_利用COALESCE处理JOIN结果
jvm·数据库·python
m0_7349497912 分钟前
mysql如何通过Docker快速搭建_mysql容器化部署实践
jvm·数据库·python
2301_7965885017 分钟前
Golang怎么处理JSON大数字精度_Golang如何避免前端JavaScript解析大整数丢失精度【避坑】
jvm·数据库·python