JVM类加载机制以及双亲委派模型的介绍

目录

1.类加载介绍

2.具体步骤

2.1加载

2.2验证

2.3准备

2.4解析

2.5初始化

3.加载过程中的策略-双亲委派模型


1.类加载介绍

类加载,指的是Java进程在运行的时候,把.class文件从硬盘读取到内存,并进行一系列校验解析的过程.

.class文件=>类对象.硬盘=>内村

类加载的过程在Java官方文档中有说明

类加载大致可以分为五个步骤:即 加载.验证 准备 解析 初始化这五个步骤.

下面我们分别来介绍这五个步骤干了一些什么

2.具体步骤

2.1加载

把硬盘上的.class文件找到并且打开文件,读取到文件内容.(具体就是二进制的数据)

2.2验证

此过程要确保读到的文件内容是合法的.class文件格式,即字节码文件格式

具体在Java虚拟机规范中有具体的说明.

类似于一个结构体的东西

其中,u4表示四个字节的无符号证书,u2是连个字节的无符号整数.这里的描述方式类似于C语言中的结构体.contant_pool_count是主版本.下面的是次版本/ jvm执行.class文件的时候就会验证版本是否符合要求,一般高版本可以兼容低版本,反之则不行.magic也叫做magic number 是魔幻数字,广泛应用于二进制文件中,用来标识当前二进制文件的格式是哪种类型

2.3准备

这一步是给类对象申请内存空间.此时申请的内存空间是已经初始化的.里面的默认值为全0.在这个阶段中,类对象的静态成员变量的值也相对于是0了.

2.4解析

主要是对类的字符串常量进行处理 我们观察一下代码:

class Test{

private String s = "hello";

}

上述代码中,s变量相对于保存了"hello"这个字符串常量的地址.但是文件中并没有地址这个概念,那么该如何保存呢?虽然没有地址,但是有一个类似于地址的偏移量的这一概念

/

此除文件填充给s "hello"的偏移量就可以叫做"符号引用"

接下来,我们把.class文件加载到内存中,就会把"hello"这个字符串加载到内存中.此时它就有地址了,接下来,就可以把s里的值替换成当前"hello"的真实地址了.

2.5初始化

针对对象完成后续的初始化,就是把各个部分的属性进行赋值填充.=>还要执行静态代码的逻辑,还可能会触发父类的加载.

而加载过程中也有很多的猫腻.这就涉及到加载环节的一个模型,即双亲委派模型

3.加载过程中的策略-双亲委派模型

该策略描述了如何查找.class文件的策略/

jvm中进行类加载的操作,有一个专门的模块,称为类加载器(ClassLoader)

JVM的类加载器默认有三个.(也可以自定义 ) 这三个分别是

BootstrapClassLoader -负责查找标准库的目录

ExtensionClassLoader - 负责查找扩展库的目录 (不同于Java语法规范中的标准库内容,这都是实现jvm的厂商额外扩充的功能,不同的厂商扩展的不一样,这块内容很少会用到了)

ApplicationLoader -负责查找当前项目和第三方库的目录

上述的三个类加载器存在父子关系,类似于二叉树,有一个指针 (引用)指向parent,指向自己的父类加载器.

双亲委派模型的工作过程

1.从ApplicationClassLoader为入口 开始工作

2 从ApplicationClassLoader不会立即工作而是把搜索任务较给自己的父亲ExtensionClassLoader

3ExtensionClassLoader也不会立即寻找,而是交给BootstrapClassLoader

4BootstrapClassLoader 也不会立即找,也会找自己的父亲

5.BootstrapClassLoader 发现自己没有父亲,才会开始搜索目录,即标准库的内容 寻找符合要求的.class文件,如果找到了就开始打开文件.读文件.如果没找到就交给自己的孩子.尝试加载

6.ExtensionClassLoader收到父亲的任务后,自己搜寻.找到了进入后续流程.找不到就继续到孩子这一类加载器中尝试加载

7 ApplicationClassLoader开始搜索,如果找到了.就继续后面的,如果没找到就搜索自己的孩子,一般来说ApplicationClassLoader它已经没有孩子了,这时候还是找不到,就会抛出一个ClassNotFountExption异常.

按照上述的设定,如果代码中自己定义了一个和标准库一样名字的类,最终程序的执行效果,自己定义的不会被加载,而是会加载标准库中的类.

可以避免自己写的类名字和标准库重名了,导致标准库的类功能失效.

相关推荐
微风粼粼12 小时前
程序员在线接单
java·jvm·后端·python·eclipse·tomcat·dubbo
掘金-我是哪吒15 小时前
分布式微服务系统架构第158集:JavaPlus技术文档平台日更-JVM基础知识
jvm·分布式·微服务·架构·系统架构
abigalexy16 小时前
深入JVM底层-内存分配算法
jvm
weixin_ab1 天前
JMM--数据原子操作
jvm
超级小忍1 天前
JVM 中的垃圾回收算法及垃圾回收器详解
java·jvm
喝可乐的布偶猫1 天前
Java类变量(静态变量)
java·开发语言·jvm
abigalexy2 天前
深入JVM底层-垃圾回收GC算法
jvm
麦兜*2 天前
Spring Boot启动优化7板斧(延迟初始化、组件扫描精准打击、JVM参数调优):砍掉70%启动时间的魔鬼实践
java·jvm·spring boot·后端·spring·spring cloud·系统架构
真实的菜3 天前
JVM类加载系统详解:深入理解Java类的生命周期
java·开发语言·jvm
在未来等你3 天前
JVM调优实战 Day 15:云原生环境下的JVM配置
java·jvm·性能优化·虚拟机·调优