JVM学习(一)-- 类加载过程与双亲委派模型
文章目录
- 类加载
- 类加载过程
- 类加载器
- 双亲委派模型
类加载
所谓的类加载,就是指将.class字节码文件实例化成Class对象并进行相关初始化的过程。通过ClassLoader类加载器将.class类文件加载到内存中,类加载机制遵循双亲委派模型。
类从被加载到JVM中开始,到卸载为止,整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。类加载过程主要包括加载,链接,初始化三个步骤
类加载过程
类加载过程主要分三步:
- 加载(load):该阶段读取类文件产生二进制流,并转换为特定的数据结构,初步校验cafe babe魔法值,常量值,文件长度,是否存在父类等,然后创建对应类的java.lang.Class实例
链接(link):该阶段包括验证,准备,解析三个步骤
- 验证:验证如final是否合规,类型是否正确,静态变量是否合理等
- 准备:为静态变量分配内存,设置默认值
- 解析:解析类与方法,确保类与类之间的相互引用正确性,完成内存结构布局
初始化(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
类,重写loadClass
和findClass
方法的方式实现自己的类加载器
双亲委派模型
一个类收到了类加载请求,他首先不会尝试自己去加载这个类,而是把这个请求委派给父类去完成,每一个层次类加载器都是如此,因此所有的加载请求都应该传送到启动类加载其中,只有当父类加载器反馈自己无法完成这个请求的时候(在它的加载路径下没有找到所需加载的Class),子类加载器才会尝试自己去加载。
采用双亲委派的一个好处是比如加载位于 rt.jar 包中的类 java.lang.Object,不管是哪个加载器加载这个类,最终都是委托给顶层的启动类加载器进行加载,这样就保证了使用不同的类加载器最终得到的都是同样一个 Object对象。
还没有评论,来说两句吧...