当前位置: 首页 > news >正文

JVM 03 类加载机制

JVM 将字节码二进制流加载到内存称为类加载。

什么时候加载类

  1. new 实例化对象。而对象所属类还没被加载。
  2. 读取/设置类的静态非常量字段,常量字段在常量池。
  3. 调用类的静态方法。
  4. 类初始化,优先初始化父类。
  5. 虚拟机启动时,先加载用户指定的主类。

第一步:加载

JVM 需要完成三项工作:

  1. 通过类的全限定类型获取二进制字节流。
  2. 将字节流转化为方法区的运行时数据结构。
  3. 生成一个Class对象,作为数据访问入口。

数组类由其组件类型定义的加载器加载。如果是基本类型数组,由引导类加载器加载,且默认访问权限为 public。

第二步:验证

目的是检验字节码二进制字节流是否符合虚拟机规范,避免其威胁虚拟机安全。包括:

  1. 文件格式验证:验证是否符合Class文件格式。是否存在魔数,主次版本号,常量等。
  2. 元数据验证:验证是否符合 Java 语言规范。是否存在父类,是否符合访问权限,是否符合重载/重写规范等。
  3. 字节码验证:验证方法体语义。
  4. 符号引用验证:是否可以将符号引用转化为直接引用。

第三步:准备

为类的静态变量分配内存并设置初始值。JDK8 以后,类变量在 Class 对象里,Class 对象在堆中。如果是变量,初始值是零值,如果是常量,初始值就是字面量。

第四步:解析

将符号引用转化为直接引用。比如全限定类名com.example.demo.Hello()就是符号引用。直接引用就是内存中目标指针,句柄或者相对偏移量。包括类/接口/字段/方法、接口方法解析。

第五步:初始化

执行类的静态赋值语句以及静态代码块。

public class Demo {public static int A = 3;static {A = 2;}
}

类加载器

JVM 中类加载器不仅起到加载类的作用。还起到唯一定义作用。加载器与类共同确定类的唯一性。不同加载器加载的同一个类不相等,Object.equals(), isAssignableFrom(), isInstance(), instanceof等判断都为false。

双亲委派模型

从 JVM 的角度,只存在两种加载器,一种是启动类加载器,它由 C++ 实现,无法获取其实例对象。一种是 Java 类加载器java.lang.ClassLoader,用户可以获取实例。

从开发人员的角度,类加载器分为三种。启动类加载器,扩展类加载器和系统类加载器。启动类加载器是同一个东西。扩展类加载器和系统类加载器是 Java 类加载器的实例。扩展类加载器加载 Java 的系统类库。系统类加载器加载用户类路径上的所有类库。

双亲委派模型指除了启动类加载器,其余类加载器都有父类加载器。工作原理是:类加载器首先将加载请求委派给父类加载器,递归委派到启动类加载器。父类加载器反馈无法加载,子类加载器才自己加载对象。
它的优点是:Java 的类也具有层次关系。无论哪个类加载 Object 类,最终都会交给启动类加载器。

http://www.lryc.cn/news/608505.html

相关文章:

  • 堆----1.数组中的第K个最大元素
  • 高效游戏状态管理:使用双模式位运算与数学运算
  • 关于人工智能AI>ML>DL>transformer及NLP的关系
  • springboot大学生成绩管理系统设计与实现
  • NCV8402ASTT1G自保护N沟道功率MOSFET安森美/ONSEMI 过流过温保护汽车级驱动NCV8402ASTT1
  • 动态规划经典模型:双数组问题的通用解决框架与实战
  • Vue3核心语法进阶(computed与监听)
  • 衡石科技实时指标引擎解析:如何实现毫秒级响应万亿级数据的增量计算?
  • 【c#窗体荔枝计算乘法,两数相乘】2022-10-6
  • 【学习笔记】Java并发编程的艺术——第1章 并发编程的挑战
  • Python打卡Day30 模块和库的导入
  • 12:java学习笔记:多维数组1
  • 如何分析Linux内存性能问题
  • 深度学习(鱼书)day09--与学习相关的技巧(前三节)
  • 2025牛客暑期多校训练营1(G,E,L,K,I)
  • 力扣 hot100 Day63
  • 使用 BERT 的 NSP 实现语义感知切片 —— 提升 RAG 系统的检索质量
  • Java试题-选择题(6)
  • 滚珠花键在汽车制造中有哪些高要求?
  • 记录一次Spring Cloud Gateway配置的跨域处理:解决 ‘Access-Control-Allow-Origin‘ 头包含多个值的问题
  • JavaScript将String转为base64 笔记250802
  • GCC(GNU Compiler Collection)与人工智能实例
  • 【前端:Html】--1.1.基础语法
  • [Linux入门] Ubuntu 系统中 iptables 的配置与使用
  • 公共卫生场景下漏检率↓76%:陌讯动态特征融合算法在口罩识别中的实战解析
  • GaussDB having 的用法
  • 适 配 器 模 式
  • 电力系统分析笔记:发电机与变压器的数学建模与运行状态详解
  • SPI通信中CS片选的两种实现方案:硬件片选与软件片选
  • Anthropic:跨越生产效能拐点的AI增长飞轮