JVM学习(一)-- 类加载过程与双亲委派模型

类加载

​ 所谓的类加载,就是指将.class字节码文件实例化成Class对象并进行相关初始化的过程。通过ClassLoader类加载器将.class类文件加载到内存中,类加载机制遵循双亲委派模型

在这里插入图片描述

类从被加载到JVM中开始,到卸载为止,整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。类加载过程主要包括加载链接初始化三个步骤

类加载过程

类加载过程主要分三步:

  1. 加载(load):该阶段读取类文件产生二进制流,并转换为特定的数据结构,初步校验cafe babe魔法值,常量值,文件长度,是否存在父类等,然后创建对应类的java.lang.Class实例
  2. 链接(link):该阶段包括验证,准备,解析三个步骤
    • 验证:验证如final是否合规,类型是否正确,静态变量是否合理等
    • 准备:为静态变量分配内存,设置默认值
    • 解析:解析类与方法,确保类与类之间的相互引用正确性,完成内存结构布局
  3. 初始化(Init):该阶段执行类构造器方法,若赋值运算是通过其他类的静态方法来完成的,那么会马上解析另一个类,在虚拟机栈中执行完毕后通过返回值进行赋值
    • 类的初始化顺序:父类静态变量 --> 父类静态代码块 --> 子类静态变量 --> 子类静态代码块 --> 父类非静态变量(父类实例成员变量)–> 父类构造函数 --> 子类非静态变量(子类实例成员变量)–>子类构造函数

类加载器

  • 启动类加载器(Bootstrap ClassLoader):C++实现,在JVM启动时创建,通常由与操作系统相关的本地代码实现,是最根基的类加载器,负责装载最核心的Java类,如Object、System、String等
  • 扩展类加载器(Extension ClassLoader,JDK9之前)/平台类加载器(Platform ClassLoader,JDK9):Java实现,用来加载 Java 的扩展库,如XML,加密,压缩相关的功能类等
  • 应用程序类加载器(Application ClassLoader):Java实现,加载 Java 应用的类路径CLASSPATH下的类
  • 自定义加载器:开发人员可以通过继承 java.lang.ClassLoader 类,重写loadClassfindClass方法的方式实现自己的类加载器

双亲委派模型

​ 一个类收到了类加载请求,他首先不会尝试自己去加载这个类,而是把这个请求委派给父类去完成,每一个层次类加载器都是如此,因此所有的加载请求都应该传送到启动类加载其中,只有当父类加载器反馈自己无法完成这个请求的时候(在它的加载路径下没有找到所需加载的Class),子类加载器才会尝试自己去加载。

​ 采用双亲委派的一个好处是比如加载位于 rt.jar 包中的类 java.lang.Object,不管是哪个加载器加载这个类,最终都是委托给顶层的启动类加载器进行加载,这样就保证了使用不同的类加载器最终得到的都是同样一个 Object对象。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值