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

超、凢脫俗 2022-12-12 15:09 133阅读 0赞

文章目录

  • 类加载
    • 类加载过程
    • 类加载器
    • 双亲委派模型

类加载

​ 所谓的类加载,就是指将.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对象。
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,133人围观)

还没有评论,来说两句吧...

相关阅读

    相关 过程双亲委派模型

    类加载过程及双亲委派模型 1.类加载流程 类加载流程主要分为五个,分别是加载–》验证–》准备–》解析–》初始化。 其中加载的过程中的主要工作就是找到.class文

    相关 双亲委派模型

    说到Java区别于其他语言的一大特性,自然很多人都会想到Java当初的愿景:一次编译,处处运行。而要实现这一目标自然离不开JVM虚拟机的功劳。为了能让编译出来的字节码可以被虚拟